Spring MVC 學習總結(八)——Spring MVC概要與環境配置(IDEA+Maven+Tomcat7+JDK8、示例與視訊)
目錄
- 一、MVC概要
- 二、Spring MVC介紹
- 三、第一個Spring MVC 專案:Hello World
- 3.1、IntelliJ IDEA中建立一個Maven專案
- 3.2、新增Web專案支援
- 3.3、配置Tomcat Web容器
- 3.4、將專案釋出到Git遠端倉庫(非必要)
- 3.5、新增依賴的jar包
- 3.6、將依賴的包新增到專案釋出檔案中
- 3.7、修改web.xml註冊中心控制器DispatcherServlet
- 3.8、新增Spring MVC配置檔案
- 3.9、建立HelloWorld控制器
- 3.10、建立檢視
- 3.11、測試執行
- 四、使用者管理示例
- 五、示例下載
- 六、視訊
- 七、作業
一、MVC概要
MVC是模型(Model)、檢視(View)、控制器(Controller)的簡寫,是一種軟體設計規範,用一種將業務邏輯、資料、顯示分離的方法組織程式碼,MVC主要作用是降低了檢視與業務邏輯間的雙向偶合。MVC不是一種設計模式,MVC是一種架構模式。當然不同的MVC存在差異。
在web早期的開發中,通常採用的都是Model1。Model1中,如圖所示主要分為兩層,檢視層和模型層。Model2把一個專案分成三部分,包括檢視、控制、模型。這樣不僅提高的程式碼的複用率與專案的擴充套件性,且大大降低了專案的維護成本。Model 1模式的實現比較簡單,適用於快速開發小規模專案,Model1中JSP頁面身兼View和Controller兩種角色,將控制邏輯和表現邏輯混雜在一起,從而導致程式碼的重用性非常低,增加了應用的擴充套件性和維護的難度。Model2消除了Model1的缺點。
Model1
Model2
常見的伺服器端MVC框架有:Struts、Spring MVC、ASP.NET MVC、Zend Framework、JSF;常見前端MVC框架:angularjs、reactjs、vue.js;由MVC演化出了另外一些模式如:MVP、MVVM。
二、Spring MVC介紹
Spring MVC是Spring Framework的一部分,是基於Java實現MVC的輕量級Web框架。Spring MVC的特點:
1、輕量
2、高效
3、與Spring相容性好
4、功能強大
RESTful、資料驗證、格式化、繫結機制、本地化、主題等
5、簡潔靈活
Spring的web框架圍繞DispatcherServlet設計。 DispatcherServlet的作用是將請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的使用者可以採用基於註解的controller宣告方式。官網上說Spring的web模組提供了大量獨特的功能,包括:
清晰的角色劃分
強大而直接的配置方式:將框架類和應用程式類都能作為JavaBean配置,支援跨多個context的引用,例如,在web控制器中對業務物件和驗證器(validator)的引用。
可適配、非侵入:可以根據不同的應用場景,選擇合適的控制器子類 (simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器 (比如Action/ActionForm)繼承。
可重用的業務程式碼:可以使用現有的業務物件作為命令或表單物件,而不需要去擴充套件某個特定框架的基類。
可定製的繫結(binding) 和驗證(validation):比如將型別不匹配作為應用級的驗證錯誤, 這可以儲存錯誤的值。再比如本地化的日期和數字繫結等等。在其他某些框架中,你只能使用字串表單物件, 需要手動解析它並轉換到業務物件。
可定製的handler mapping和view resolution:Spring提供從最簡單的URL對映, 到複雜的、專用的定製策略。與某些web MVC框架強制開發人員使用單一特定技術相比,Spring顯得更加靈活。
靈活的model轉換:在Springweb框架中,使用基於Map的 鍵/值對來達到輕易地與各種檢視技術的整合。
可定製的本地化和主題(theme)解析:支援在JSP中可選擇地使用Spring標籤庫、支援JSTL、支援Velocity(不需要額外的中間層)等等。
簡單而強大的JSP標籤庫(Spring Tag Library):支援包括諸如資料繫結和主題(theme) 之類的許多功能。它提供在標記方面的最大靈活性。
JSP表單標籤庫:在Spring2.0中引入的表單標籤庫,使得在JSP中編寫 表單更加容易。
Spring Bean的生命週期可以被限制在當前的HTTP Request或者HTTP Session。 準確的說,這並非Spring MVC框架本身特性,而應歸屬於Sping MVC使用的WebApplicationContext容器。
2.1、學習資料
http://7xvpsh.com1.z0.glb.clouddn.com/Spring MVC翻譯
http://spring.cndocs.tk/Spring翻譯
http://blog.csdn.net/tangtong1/article/details/51326887Spring 1-6章
https://github.com/linesh-simplicity/translation-spring-mvc-4-documentation翻譯列表
https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html官方幫助
三、第一個Spring MVC 專案:Hello World
3.1、IntelliJ IDEA中建立一個Maven專案
在IntelliJ IDEA中新建Maven專案,選擇“File->New->Project”,建立一個簡單專案,不選擇模板。
選擇“Maven”,不需要使用內建結構(模板)
填寫包名與專案名:
選擇專案位置,儘量不要有中文、空格或特殊字元,點選完成:
完成後點選“Enable-Auto import”
3.2、新增Web專案支援
前面我們建立好了一個普通的Java專案,現在需要將普通專案轉換成Web專案
選擇“Web Application”
點選OK後項目就變成Web專案了,且根據Maven風格建立了不同型別的資料夾
如果使用內建架構建立則需要手動新增不同的資料夾型別
3.3、配置Tomcat Web容器
點選右側下拉列表,選擇編輯配置檔案
在配置視窗中點中左上角的“加號”->Tomcat Server->"Local"
命名
新增部署包
設定專案的虛擬目錄名稱(Application context應用上下文)
選擇修改專案後伺服器動作
修改index.jsp檔案後執行專案
啟動專案後的執行結果:
注意這裡的tomcat的日誌與eclipse整合後是不一樣的,分開在多個視窗中輸出。
3.4、將專案釋出到Git遠端倉庫(非必要)
點選“VCS”->"Enable Version Control Integration",將專案整合到版本控制器中
選擇版本控制器型別為Git
提交專案到本地倉庫
選擇要提交的檔案並填寫好日誌資訊:
管理遠端倉庫地址
點選加號新增
新增成功後
提交到遠端倉庫
點選push
提交成功
檢視結果
3.5、新增依賴的jar包
1、修改pom.xml檔案、新增jar包的依賴,主要有:Spring框架核心庫、Spring MVC、JSTL等,具體資訊如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zhangguo</groupId> <artifactId>springmvc08</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.3.0.RELEASE</spring.version> </properties> <!--專案依賴 --> <dependencies> <!--單元測試--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <!--j2ee相關包 servlet、jsp、jstl--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!--mysql驅動包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <!--spring相關包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!--其他需要的包--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> </dependencies> <build> <finalName>maven-springmvc</finalName> <resources> <!--表示把java目錄下的有關xml檔案,properties檔案編譯/打包的時候放在resource目錄下--> <resource> <directory>${basedir}/src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> <resource> <directory>${basedir}/src/main/resources</directory> </resource> </resources> <plugins> <!--servlet容器 jetty外掛--> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.3.10.v20160621</version> </plugin> </plugins> </build> </project>
如果需要其它的包可以去中心倉庫搜尋
如果下載太慢可以將maven的遠端中心倉庫的地址換成國內倉庫。
預設會自動下載jar包,第一次下載會較慢,以後從本地引用就會快很多
當依賴成功時,會載入的jar包如下:
將maven依賴的包新增到專案中,釋出時一起打包
3.6、將依賴的包新增到專案釋出檔案中
點選專案結構(ctrl+shift+alt+s)
點選“Artifacts”->"Output Layout"->雙擊要輸出的包
成功新增後在lib目錄下就可以看到輸出的包了
3.7、修改web.xml註冊中心控制器DispatcherServlet
Spring MVC框架像許多其他MVC框架一樣, 請求驅動,圍繞一箇中心Servlet分派請求及提供其他功能,DispatcherServlet是一個實際的Servlet (它繼承自HttpServlet 基類)。如下圖所示當發起請求時被前置的控制器攔截到請求,根據請求引數生成代理請求,找到請求對應的實際控制器,控制器處理請求,建立資料模型,訪問資料庫,將模型響應給中心控制器,控制器使用模型與檢視渲染檢視結果,將結果返回給中心控制器,再將結果返回給請求者。
修改web.xml檔案註冊該Servlet,修改後的web.xml檔案如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--welcome pages--> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!--配置springmvc DispatcherServlet--> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!--Sources標註的資料夾下需要新建一個spring資料夾--> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.8、新增Spring MVC配置檔案
在src/main/resources原始碼目錄下新增spring目錄與spring-mvc.xml配置檔案,配置的形式與Spring容器配置基本類似,為了支援基於註解的IOC,設定了自動掃描包的功能,具體配置資訊如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!--啟用spring的一些annotation --> <context:annotation-config/> <!-- 自動掃描該包,使SpringMVC認為包下用了@controller註解的類是控制器 --> <context:component-scan base-package="com.zhangguo.springmvc08.controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--HandlerMapping 無需配置,springmvc可以預設啟動--> <!--靜態資源對映--> <mvc:default-servlet-handler/> <!--如果發現是靜態資源的請求,就將該請求轉由Web應用伺服器預設的Servlet處理,如果不是靜態資源的請求,才由DispatcherServlet繼續處--> <!--本專案把靜態資源放在了WEB-INF的statics目錄下,資源對映如下--> <!--<mvc:resources mapping="/css/**" location="/WEB-INF/statics/css/"/>--> <!--<mvc:resources mapping="/js/**" location="/WEB-INF/statics/js/"/>--> <!--<mvc:resources mapping="/image/**" location="/WEB-INF/statics/image/"/>--> <!--但是專案部署到linux下發現WEB-INF的靜態資源會出現無法解析的情況,但是本地tomcat訪問正常,因此建議還是直接把靜態資源放在webapp的statics下,對映配置如下--> <!--<mvc:resources mapping="/css/**" location="/statics/css/"/>--> <!--<mvc:resources mapping="/js/**" location="/statics/js/"/>--> <!--<mvc:resources mapping="/image/**" location="/statics/images/"/>--> <!-- 配置註解驅動 可以將request引數與繫結到controller引數上 --> <mvc:annotation-driven/> <!-- 對模型檢視名稱的解析,即在模型檢視名稱新增前後綴(如果最後一個還是表示資料夾,則最後的斜槓不要漏了) 使用JSP--> <!-- 預設的檢視解析器 在上邊的解析錯誤時使用 (預設使用html)- --> <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/views/"/><!--設定JSP檔案的目錄位置--> <property name="suffix" value=".jsp"/> </bean> <!-- springmvc檔案上傳需要配置的節點--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="20971500"/> <property name="defaultEncoding" value="UTF-8"/> <property name="resolveLazily" value="true"/> </bean> </beans>
在檢視解析中我們把所有的檢視都存放在/WEB-INF/目錄下,這樣是為了檢視安全,因為這個目錄客戶端不能直接訪問。
3.9、建立HelloWorld控制器
在src/main/java原始碼目錄下建立包com.zhangguo.springmvc08.controller,在包下建立一個普通的類:HomeController,具體程式碼如下:
package com.zhangguo.springmvc08.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller //宣告為控制器 @RequestMapping(path = "/home") //請求對映 public class HomeController { @RequestMapping(path = "/index") //請求對映 public String index(Model model){ model.addAttribute("message","Hello Spring MVC!"); return "home/index"; } }
註解為@Controller是為了讓Spring IOC容器初始化時自動掃描到;@RequestMapping是為了對映請求路徑,這裡因為類與方法上都有對映所以訪問時應該是/home/index;方法中宣告Model型別的引數是為了把Action中的資料帶到檢視中;方法返回的結果是檢視的名稱index。
3.10、建立檢視
在WEB-INF/view目錄中建立檢視,檢視將從Action中帶回的資訊展示,具體內容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h2> ${message} </h2> </body> </html>
3.11、測試執行
啟動Tomcat執行專案,請注意檢視啟動資訊,如果有異常應該先解決異常資訊,執行成功後的結果如下所示:
四、使用者管理示例
使用Spring MVC實現一個簡單的使用者管理示例,專案結構如下
執行結果:
4.1、使用者Bean
使用者實體類user.java
package com.zhangguo.springmvc08.entity; /*** * 使用者 */ public class User { public User(int id, String name, String address, String phone) { this.id = id; this.name = name; this.address = address; this.phone = phone; } public User() { } /** * 編號 */ private int id; /** * 姓名 */ private String name; /** * 地址 */ private String address; /** * 電話 */ private String phone; public int getId() { return id; } public void setId(int id) { this.id = id; } /** * 姓名 */ public String getName() { return name; } /** * 姓名 */ public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
4.2、使用者資料訪問物件
使用者資料訪問介面 IUserDAO
package com.zhangguo.springmvc08.dao; import com.zhangguo.springmvc08.entity.User; import java.util.List; /** * 使用者資料訪問介面 */ public interface IUserDAO { /**獲得所有*/ List<User> getAll(); /**根據使用者編號獲得使用者物件*/ User getUserById(int id); /**新增*/ boolean add(User user); /**刪除*/ boolean delete(int id); /**更新*/ boolean update(User user); }
UserDAO.java
package com.zhangguo.springmvc08.dao; import com.zhangguo.springmvc08.entity.User; import org.springframework.stereotype.Repository; import java.util.ArrayList; import java.util.List; /** * 使用者資料訪問物件 */ @Repository public class UserDAO implements IUserDAO { private static List<User> users = new ArrayList<User>(); static { users.add(new User(1, "劉德華", "中國香港", "13767890098")); users.add(new User(2, "張學友", "中國廣東", "18989890767")); users.add(new User(3, "張國立", "中國北京", "13345672345")); users.add(new User(4, "張靚因", "中國上海", "15890908679")); users.add(new User(5, "齊萍萍", "中國珠海", "13246712235")); } /** * 獲得所有 */ public List<User> getAll() { return users; } /** * 單個使用者 */ public User getUserById(int id) { for (User user : users) { if (user.getId() == id) { return user; } } return null; } /** * 新增 */ public boolean add(User user) { if(user.getId()<=0) { user.setId(users.get(users.size()-1).getId()+1); } users.add(user); return true; } /** * 刪除 */ public boolean delete(int id) { users.remove(getUserById(id)); return true; } /** * 更新 */ public boolean update(User user) { User oldUser = getUserById(user.getId()); oldUser.setName(user.getName()); oldUser.setAddress(user.getAddress()); oldUser.setPhone(user.getPhone()); return true; } }
4.3、使用者業務物件
使用者業務類UserService.java
package com.zhangguo.springmvc08.service; import com.zhangguo.springmvc08.dao.IUserDAO; import com.zhangguo.springmvc08.dao.UserDAO; import com.zhangguo.springmvc08.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /**使用者業務*/ @Service public class UserService { @Autowired IUserDAO userdao; public List<User> queryAllUsers(){ return userdao.getAll(); } public User getUserById(int id){ return userdao.getUserById(id); } public boolean deleteUser(int id){ return userdao.delete(id); } public boolean addUser(User user){ return userdao.add(user); } public boolean editUser(User user){ return userdao.update(user); } }
4.4、控制器
使用者控制器UserController.java
package com.zhangguo.springmvc08.controller; import com.zhangguo.springmvc08.entity.User; import com.zhangguo.springmvc08.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller //宣告為控制器 @RequestMapping(path = "/user") //請求對映 public class UserController { @Autowired UserService userService; @RequestMapping(path = "/index") //請求對映 public String index(Model model){ model.addAttribute("list",userService.queryAllUsers()); return "user/index"; } @RequestMapping("/delete/{id}") public String delete(@PathVariable int id){ userService.deleteUser(id); return "redirect:/user/index"; } @RequestMapping("/add") public String add(){ return "user/add"; } @RequestMapping(value = "/add",method = RequestMethod.POST) public String add(User user){ userService.addUser(user); return "redirect:/user/index"; } @RequestMapping("/edit/{id}") public String edit(@PathVariable int id,Model model){ model.addAttribute("user",userService.getUserById(id)); return "user/edit"; } @RequestMapping(value = "/edit",method = RequestMethod.POST) public String edit(User user){ userService.editUser(user); return "redirect:/user/index"; } }
4.5、使用者檢視
列表:user/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>使用者管理</title> </head> <body> <h2> 使用者管理 </h2> <table width="100%" border="1"> <tr> <th>編號</th> <th>姓名</th> <th>地址</th> <th>電話</th> <th>操作</th> </tr> <c:forEach items="${list}" var="user"> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.address}</td> <td>${user.phone}</td> <td> <a href="delete/${user.id}" class="del">刪除</a> | <a href="edit/${user.id}">修改</a></td> </tr> </c:forEach> </table> <p> <a href="add">新增</a> </p> <script> var items = document.querySelectorAll(".del"); for (var i = 0; i < items.length; i++) { items[i].onclick = function () { return confirm("您確認要刪除嗎?"); } } </script> </body> </html>
新增:user/add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>使用者管理</title> </head> <body> <h2> 新增使用者 </h2> <form method="post" action="add"> <fieldset> <legend>使用者資訊</legend> <p> <label for="name">姓名:</label> <input name="name" id="name" type="text" required="required" maxlength="32"/> </p> <p> <label for="address">地址:</label> <input name="address" id="address" type="text" required="required" maxlength="128"/> </p> <p> <label for="phone">電話:</label> <input name="phone" id="phone" type="text" required="required" maxlength="11"/> </p> <p> <button>提交</button> </p> </fieldset> </form> <a href="index">列表</a> </body> </html>
編輯:user/edit.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>使用者管理</title> </head> <body> <h2> 修改使用者 </h2> <form method="post" action="../edit"> <fieldset> <legend>使用者資訊</legend> <p> <label for="id">編號:</label> <input name="id" id="id" type="text" required="required" readonly="readonly" maxlength="32" value="${user.id}"/> </p> <p> <label for="name">姓名:</label> <input name="name" id="name" type="text" required="required" maxlength="32" value="${user.name}"/> </p> <p> <label for="address">地址:</label> <input name="address" id="address" type="text" required="required" maxlength="128" value="${user.address}"/> </p> <p> <label for="phone">電話:</label> <input name="phone" id="phone" type="text" required="required" maxlength="11" value="${user.phone}"/> </p> <p> <button>提交</button> </p> </fieldset> </form> <a href="index">列表</a> </body> </html>
4.6、Spring-MVC配置檔案
resources/spring/spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!--啟用spring的一些annotation --> <context:annotation-config/> <!-- 自動掃描該包,使SpringMVC認為包下用了@controller註解的類是控制器 --> <context:component-scan base-package="com.zhangguo.springmvc08"> </context:component-scan> <!--HandlerMapping 無需配置,springmvc可以預設啟動--> <!--靜態資源對映--> <mvc:default-servlet-handler/> <!--如果發現是靜態資源的請求,就將該請求轉由Web應用伺服器預設的Servlet處理,如果不是靜態資源的請求,才由DispatcherServlet繼續處--> <!--本專案把靜態資源放在了WEB-INF的statics目錄下,資源對映如下--> <!--<mvc:resources mapping="/css/**" location="/WEB-INF/statics/css/"/>--> <!--<mvc:resources mapping="/js/**" location="/WEB-INF/statics/js/"/>--> <!--<mvc:resources mapping="/image/**" location="/WEB-INF/statics/image/"/>--> <!--但是專案部署到linux下發現WEB-INF的靜態資源會出現無法解析的情況,但是本地tomcat訪問正常,因此建議還是直接把靜態資源放在webapp的statics下,對映配置如下--> <!--<mvc:resources mapping="/css/**" location="/statics/css/"/>--> <!--<mvc:resources mapping="/js/**" location="/statics/js/"/>--> <!--<mvc:resources mapping="/image/**" location="/statics/images/"/>--> <!-- 配置註解驅動 可以將request引數與繫結到controller引數上 --> <mvc:annotation-driven/> <!-- 對模型檢視名稱的解析,即在模型檢視名稱新增前後綴(如果最後一個還是表示資料夾,則最後的斜槓不要漏了) 使用JSP--> <!-- 預設的檢視解析器 在上邊的解析錯誤時使用 (預設使用html)- --> <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/views/"/><!--設定JSP檔案的目錄位置--> <property name="suffix" value=".jsp"/> </bean> <!-- springmvc檔案上傳需要配置的節點--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="20971500"/> <property name="defaultEncoding" value="UTF-8"/> <property name="resolveLazily" value="true"/> </bean> </beans>
五、示例下載
https://zhangguo5.coding.net/public/SpringMVC08/SpringMVC08/git
六、視訊
https://www.bilibili.com/video/av16991874/
七、作業
6.1、請使用Spring MVC在頁面上顯示當前日期
6.2、請使用Spring MVC完成如下功能(三選一),可以不使用資料庫,直接使用集合就可以了