本章主要內容包含SpringMVC簡介、MyBatis整合SpringMVC(主要是在前面的MyBatis整合Spring基礎上進行)、Spring應用實例等。javascript
SpringMVC因Spring的名氣而獲得大範圍地應用,固然了,除此以外SpringMVC的確簡單易學,同時其自己與Struts2比較夠輕量。html
比較概括爲以下:java
(1)入口不一樣:SpringMVC的入口是Servlet,Struts的入口是Filter。jquery
(2)性能上:spring3 mvc是方法級別的攔截,攔截到方法後根據參數上的註解,把request數據注入進去,在spring3 mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,而後調用setter getter方法把request中的數據注入;struts2其實是經過setter getter方法與request打交道的;struts2中,一個Action對象對應一個request上下文。 web
(3)攔截器實現機制上,Struts2有以本身的interceptor機制,SpringMVC用的是獨立的AOP方式,這樣致使Struts2的配置文件量仍是比SpringMVC大。ajax
(4)設計思想上,Struts2更加符合OOP的編程思想, SpringMVC就比較謹慎,在servlet上擴展。spring
(5)SpringMVC集成了Ajax,使用很是方便,只需一個註解@ResponseBody就能夠實現,而後直接返回響應文本便可,而Struts2攔截器集成了Ajax,在Action中處理時通常必須安裝插件或者本身寫代碼集成進去,使用起來也相對不方便。數據庫
(6)Spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(固然Struts2也能夠經過不一樣的目錄結構和相關配置作到SpringMVC同樣的效果,可是須要xml配置的地方很多)。編程
三層架構在Java中是比較出名的,三層架構無非是數據訪問層、業務邏輯層、Web層(又稱UI層)等。
其中Web層中就涉及到MVC模式(模型-視圖-控制器),MVC模式能夠以SpringMVC官方網站的一張圖來表示:json
通常一般整合SpringMVC並不須要花多大力氣,很簡單的。若是是Spring+SpringMVC+MyBatis整合,最好仍是先將Spring+MyBatis先整合好,這樣能夠省去不少沒必要要的麻煩。而後就能夠無縫集成SpringMVC。
依賴複用能夠參考MyBatis集成Spring
直接能夠將裏面的依賴複用
package com.tutorialspoint; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.ui.ModelMap; @Controller @RequestMapping("/hello") public class HelloController{ @RequestMapping(method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; } }
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring MVC Application</display-name> <servlet> <description>spring mvc servlet</description> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.tutorialspoint" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
<%@ page contentType="text/html; charset=UTF-8" %> <html> <head> <title>Hello World</title> </head> <body> <h2>${message}</h2> </body> </html>
應用實例很多如下只列出這麼幾個?
(1)異常處理;
(2)文件上傳;
(3)跨域請求;
(4)表單處理;
(5)重定向;
異常處理,對於項目開發相當重要,總不能用戶點擊一個頁面出錯了,直接報500,那樣用戶體驗多很差啊!
因此這裏講的是SpringMVC對異常的處理,但願能給你們帶來必定的 幫助和啓發。
(1)編寫實體
package com.tutorialspoint; public class Student { private Integer age; private String name; private Integer id; public void setAge(Integer age) { this.age = age; } public Integer getAge() { return age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setId(Integer id) { this.id = id; } public Integer getId() { return id; } }
(2)編寫異常
package com.tutorialspoint; public class SpringException extends RuntimeException{ private String exceptionMsg; public SpringException(String exceptionMsg) { this.exceptionMsg = exceptionMsg; } public String getExceptionMsg(){ return this.exceptionMsg; } public void setExceptionMsg(String exceptionMsg) { this.exceptionMsg = exceptionMsg; } }
(3)編寫測試Controller
package com.tutorialspoint; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.ui.ModelMap; @Controller public class StudentController { @RequestMapping(value = "/student", method = RequestMethod.GET) public ModelAndView student() { return new ModelAndView("student", "command", new Student()); } @RequestMapping(value = "/addStudent", method = RequestMethod.POST) @ExceptionHandler({SpringException.class}) public String addStudent( @ModelAttribute("HelloWeb")Student student, ModelMap model) { if(student.getName().length() < 5 ){ throw new SpringException("Given name is too short"); }else{ model.addAttribute("name", student.getName()); } if( student.getAge() < 10 ){ throw new SpringException("Given age is too low"); }else{ model.addAttribute("age", student.getAge()); } model.addAttribute("id", student.getId()); return "result"; } }
(3)在application-mvc.xml補充以下內容
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="com.tutorialspoint.SpringException"> ExceptionPage </prop> </props> </property> <property name="defaultErrorView" value="error"/> </bean>
(4)編寫JSP
student.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring MVC Exception Handling</title> </head> <body> <h2>Student Information</h2> <form:form method="POST" action="/HelloWeb/addStudent"> <table> <tr> <td><form:label path="name">Name</form:label></td> <td><form:input path="name" /></td> </tr> <tr> <td><form:label path="age">Age</form:label></td> <td><form:input path="age" /></td> </tr> <tr> <td><form:label path="id">id</form:label></td> <td><form:input path="id" /></td> </tr> <tr> <td colspan="2"> <input type="submit" value="Submit"/> </td> </tr> </table> </form:form> </body> </html>
error.jsp
<html> <head> <title>Spring Error Page</title> </head> <body> <p>An error occured, please contact webmaster.</p> </body> </html>
ExceptionPage.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring MVC Exception Handling</title> </head> <body> <h2>Spring MVC Exception Handling</h2> <h3>${exception.exceptionMsg}</h3> </body> </html>
result.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring MVC Form Handling</title> </head> <body> <h2>Submitted Student Information</h2> <table> <tr> <td>Name</td> <td>${name}</td> </tr> <tr> <td>Age</td> <td>${age}</td> </tr> <tr> <td>ID</td> <td>${id}</td> </tr> </table> </body> </html>
(5)運行項目
出現如圖所示,表示成功
在SpringMVC中有兩種處理異常的方式,那麼就存在一個優先級的問題:
當發生異常的時候,SpringMVC會以下處理:
a.SpringMVC會先從配置文件找異常解析器HandlerExceptionResolver
b.若是找到了異常異常解析器,那麼接下來就會判斷該異常解析器可否處理當前發生的異常
c.若是能夠處理的話,那麼就進行處理,而後給前臺返回對應的異常視圖
d.若是沒有找到對應的異常解析器或者是找到的異常解析器不能處理當前的異常的時候,就看當前的Controller中有沒有提供對應的異常處理器,若是提供了就由Controller本身進行處理並返回對應的視圖
e.若是配置文件裏面沒有定義對應的異常解析器,而當前Controller中也沒有定義的話,那麼該異常就會被拋出來。
傳統的圖片服務器ftp,就如今而言已經沒幾我的在用了,固然了,wordpress相關的插件安裝和主題下載就用到ftp。
固然了,還有很多企業將上傳文件(包含圖片等)放入線上tomcat某個文件夾下或者項目裏面,這樣的弊端使項目會愈來愈龐大,以前龐大是由於不斷增加的需求,代碼不得不越多,所以也會擴充容量。
不過目前不少企業一般採用好比騰訊雲、阿里雲、七牛雲等對象存儲,做爲圖片存儲。
今天咱們就以騰訊雲的對象存儲爲例。
(1)導入依賴
<!-- 騰訊雲 --> <dependency> <groupId>com.qcloud</groupId> <artifactId>cos_api</artifactId> <version>5.2.4</version> </dependency>
(2)編寫工具類
package com.custome; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObjectResult; import com.qcloud.cos.region.Region; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.net.URL; import java.util.Date; import java.util.Random; public class COSClientUtil { //todo 這些變量信息自行到 騰訊雲對象存儲控制檯 獲取 private COSClient cOSClient; private static final String ENDPOINT = "test.com"; //用戶能夠指定域名,不指定則爲默認生成的域名 //secretId private static final String secretId = "AKIDCJ"; // secretKey private static final String secretKey = "CD7"; // 存儲通名稱 private static final String bucketName = "test";//公有讀私有寫 // 1 初始化用戶身份信息(secretId, secretKey) private static COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); // 2 設置bucket的區域, COS地域的簡稱請參照 https://cloud.tencent.com/document/product/436/6224 private static ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing-1")); // 3 生成cos客戶端 private static COSClient cosclient = new COSClient(cred, clientConfig); public COSClientUtil() { cOSClient = new COSClient(cred, clientConfig); } /** * 銷燬 */ public void destory() { cOSClient.shutdown(); } /** * 上傳圖片 * * @param url */ public void uploadImg2Cos(String url) throws Exception { File fileOnServer = new File(url); FileInputStream fin; try { fin = new FileInputStream(fileOnServer); String[] split = url.split("/"); this.uploadFile2Cos(fin, split[split.length - 1]); } catch (FileNotFoundException e) { throw new Exception("圖片上傳失敗"); } } public String uploadFile2Cos(MultipartFile file) throws Exception { if (file.getSize() > 10 * 1024 * 1024) { throw new Exception("上傳圖片大小不能超過10M!"); } //圖片名稱 String originalFilename = file.getOriginalFilename(); System.out.println("originalFilename = " + originalFilename); //圖片後綴 String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); System.out.println("substring = " + substring); Random random = new Random(); //生成新的圖片名稱(隨機數0-9999+系統當前時間+上傳圖片名) String name = random.nextInt(10000) + System.currentTimeMillis() + "_" + substring; try { InputStream inputStream = file.getInputStream(); this.uploadFile2Cos(inputStream, name); return name; } catch (Exception e) { throw new Exception("圖片上傳失敗"); } } /** * 得到圖片路徑 * * @param fileUrl * @return */ public String getImgUrl(String fileUrl) { return getUrl(fileUrl); } /** * 得到url連接 * * @param key * @return */ public String getUrl(String key) { // 設置URL過時時間爲10年 3600l* 1000*24*365*10 Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10); // 生成URL URL url = cOSClient.generatePresignedUrl(bucketName, key, expiration); if (url != null) { return url.toString(); } return null; } /** * 上傳到COS服務器 若是同名文件會覆蓋服務器上的 * * @param instream * 文件流 * @param fileName * 文件名稱 包括後綴名 * @return 出錯返回"" ,惟一MD5數字簽名 */ public String uploadFile2Cos(InputStream instream, String fileName) { String ret = ""; try { // 建立上傳Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(instream.available()); objectMetadata.setCacheControl("no-cache"); objectMetadata.setHeader("Pragma", "no-cache"); objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf(".")))); objectMetadata.setContentDisposition("inline;filename=" + fileName); // 上傳文件 PutObjectResult putResult = cOSClient.putObject(bucketName, fileName, instream, objectMetadata); ret = putResult.getETag(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret; } /** * Description: 判斷Cos服務文件上傳時文件的contentType * * @param filenameExtension 文件後綴 * @return String */ public static String getcontentType(String filenameExtension) { if (filenameExtension.equalsIgnoreCase("bmp")) { return "image/bmp"; } if (filenameExtension.equalsIgnoreCase("gif")) { return "image/gif"; } if (filenameExtension.equalsIgnoreCase("jpeg") || filenameExtension.equalsIgnoreCase("jpg") || filenameExtension.equalsIgnoreCase("png")) { return "image/jpeg"; } if (filenameExtension.equalsIgnoreCase("html")) { return "text/html"; } if (filenameExtension.equalsIgnoreCase("txt")) { return "text/plain"; } if (filenameExtension.equalsIgnoreCase("vsd")) { return "application/vnd.visio"; } if (filenameExtension.equalsIgnoreCase("pptx") || filenameExtension.equalsIgnoreCase("ppt")) { return "application/vnd.ms-powerpoint"; } if (filenameExtension.equalsIgnoreCase("docx") || filenameExtension.equalsIgnoreCase("doc")) { return "application/msword"; } if (filenameExtension.equalsIgnoreCase("xml")) { return "text/xml"; } return "image/jpeg"; } }
(3)編寫測試Controller
@PostMapping(value="/uploadPicture",produces="application/json;charset=utf-8") public JSONObject upModify(HttpServletRequest request, MultipartFile file) { JSONObject json = new JSONObject(); try { COSClientUtil cosClientUtil = new COSClientUtil(); //獲取Cookie String cookie = CookieUtils.getCookie(request,"userCode"); //解密後的userCode String decodeStr = Base64.decodeStr(cookie); if(!file.isEmpty()) { String name = cosClientUtil.uploadFile2Cos(file); //圖片名稱 System.out.println("name = " + name); //上傳到騰訊雲 String img_url = cosClientUtil.getImgUrl(name); System.out.println("img_url = " + img_url); //數據庫保存圖片地址 String db_img_url = img_url.substring(0,img_url.indexOf("?")); System.out.println("db_img_url = " + db_img_url); SysUser user = new SysUser(); user.setUserCode(decodeStr); user.setAvatar(db_img_url); //調用修改邏輯 boolean isModifyUser = userService.updateById(user); if(isModifyUser) { json.put("returnCode", "000000"); json.put("returnMsg", "上傳文件成功"); }else { json.put("returnCode", "111111"); json.put("returnMsg", "上傳文件失敗"); } }else { json.put("returnCode", "222222"); json.put("returnMsg", "參數異常"); } } catch (Exception e) { e.printStackTrace(); json.put("returnCode", "333333"); json.put("returnMsg", "特殊異常"); } return json; }
(4)編寫簡單的html測試
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>上傳圖片測試</title> <script type="text/javascript" src="../js/jquery-1.8.0.min.js"></script> <script type="text/javascript"> function setImg(obj){//用於進行圖片上傳,返回地址 var f = $(obj).val(); if(f == null || f == undefined || f == ''){ return false; } if(!/\.(?:png|jpg|bmp|gif|PNG|JPG|BMP|GIF)$/.test(f)) { alertLayel("類型必須是圖片(.png|jpg|bmp|gif|PNG|JPG|BMP|GIF)"); $(obj).val(''); return false; } var data = new FormData(); $.each($(obj)[0].files,function(i,file){ data.append('file', file); }); var upload_img = $("#uploadinput")[0].files[0]; var url = window.URL.createObjectURL(upload_img); $.ajax({ type: "POST", url: "uploadPicture", data: data, cache: false, contentType: false, //必須false纔會自動加上正確的Content-Type processData: false, //必須false纔會自動加上正確的Content-Type dataType:"json", success: function(data) { alert(data.returnMsg) }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); // 狀態 alert(XMLHttpRequest.readyState); // 錯誤信息 alert(textStatus); } }); } </script> </head> <body> <input type="file" id="uploadinput" name="file" onchange="setImg(this)"/> </body> </html>
(1)編寫攔截器
package com.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class CORSInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.addHeader("Access-Control-Allow-Origin", "*"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
(2)application-mvc.xml配置攔截器
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.interceptor.CORSInterceptor"/> </mvc:interceptor> </mvc:interceptors>
(3)編寫html測試
<html> <head> <meta charset="utf-8"> <script src="jquery-1.8.0.min.js"></script> <script> function test(){ var str="test"; $.ajax({ url:"http://192.168.1.125:8080/test-web/user/getCookie", type:"POST", data : {"str":str}, dataType : 'json', success:function(data){ alert(data.returnMsg); },error:function(XMLHttpRequest, textStatus, errorThrown){ alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); } }); } </script> </head> <body onload="test()"> </body>
(1)編寫實體
實體能夠複用前面的,之因此列出來防止一些讀者不理解。
package com.tutorialspoint; public class Student { private Integer age; private String name; private Integer id; public void setAge(Integer age) { this.age = age; } public Integer getAge() { return age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setId(Integer id) { this.id = id; } public Integer getId() { return id; } }
(2)編寫Controller
package com.tutorialspoint; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.ui.ModelMap; @Controller public class StudentController { @RequestMapping(value = "/student", method = RequestMethod.GET) public ModelAndView student() { return new ModelAndView("student", "command", new Student()); } @RequestMapping(value = "/addStudent", method = RequestMethod.POST) public String addStudent(@ModelAttribute("SpringWeb")Student student, ModelMap model) { model.addAttribute("name", student.getName()); model.addAttribute("age", student.getAge()); model.addAttribute("id", student.getId()); return "result"; } }
ModelMap同ModelAndView相同點,將數據已鍵值對形式返回到前臺,而前臺只需知道對應的鍵便可,就能夠得到對應的值。
固然就視圖與數據分離而言,儘可能不要使用ModelAndView,儘可能使用Model或者ModelMap也能夠。
(3)編寫jsp
student.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring MVC Form Handling</title> </head> <body> <h2>Student Information</h2> <form:form method="POST" action="/spring-example/addStudent"> <table> <tr> <td><form:label path="name">Name</form:label></td> <td><form:input path="name" /></td> </tr> <tr> <td><form:label path="age">Age</form:label></td> <td><form:input path="age" /></td> </tr> <tr> <td><form:label path="id">id</form:label></td> <td><form:input path="id" /></td> </tr> <tr> <td colspan="2"> <input type="submit" value="Submit"/> </td> </tr> </table> </form:form> </body> </html>
result.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring MVC Form Handling</title> </head> <body> <h2>Submitted Student Information</h2> <table> <tr> <td>Name</td> <td>${name}</td> </tr> <tr> <td>Age</td> <td>${age}</td> </tr> <tr> <td>ID</td> <td>${id}</td> </tr> </table> </body> </html>
(4)測試
啓動應用測試,結果如圖:
說到重定向不得不提到一個轉發。這裏概述一下轉發與重定向的區別:
重定向和轉發有一個重要的不一樣:當使用轉發時,JSP容器將使用一個內部的方法來調用目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器發送一個新的頁面請求。由於,當你使用重定向時,瀏覽器中所顯示的URL會變成新頁面的URL, 而當使用轉發時,該URL會保持不變。重定向的速度比轉發慢,由於瀏覽器還得發出一個新的請求。同時,因爲重定向方式產生了一個新的請求,因此通過一次重 定向後,request內的對象將沒法使用。
轉發和重定向的區別
不要僅僅爲了把變量傳到下一個頁面而使用session做用域,那會無端增大變量的做用域,轉發也許能夠幫助你解決這個問題。
重定向:之前的request中存放的變量所有失效,並進入一個新的request做用域。
轉發:之前的request中存放的變量不會失效,就像把兩個頁面拼到了一塊兒。
好比session的保存,就是轉發的一個應用實例。
Session經過setAttribute以鍵值對的形式保存Session,而要得到該session,只需getAttribute對應的鍵便可,固然了,Session也有它的生命週期,即有效期,超過這個有效期則會發生session失效問題。
一般session有效默認爲30分鐘,能夠經過web.xml配置修改
<session-config> <session-timeout>60</session-timeout> </session-config>
(1)編寫示例
package com.tutorialspoint; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class WebController { @RequestMapping(value = "/index", method = RequestMethod.GET) public String index() { return "index"; } @RequestMapping(value = "/redirect", method = RequestMethod.GET) public String redirect() { return "redirect:finalPage"; } @RequestMapping(value = "/finalPage", method = RequestMethod.GET) public String finalPage() { return "final"; } }
(2)編寫index.jsp和final.jsp
index.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring Page Redirection</title> </head> <body> <h2>Spring Page Redirection</h2> <p>Click below button to redirect the result to new page</p> <form:form method="GET" action="/spring-example/redirect"> <table> <tr> <td> <input type="submit" value="Redirect Page"/> </td> </tr> </table> </form:form> </body> </html>
final.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <html> <head> <title>Spring Page Redirection</title> </head> <body> <h2>Redirected Page</h2> </body> </html>
(3)啓動服務器,輸入對應的地址
點擊紅色標記處,會出現如圖,這樣就表示正常,不然多是500,那就是代碼有問題或者環境問題
本章內容主要有SpringMVC簡介、MyBatis整合SpringMVC(主要是在前面的MyBatis整合Spring基礎上進行)、Spring應用實例等。
經過對這些內容的介紹說明和示例講解,相信你已經學會使用了。
本文部份內容主要來自筆者博客園