一、Spring MVC 工作流程圖
二、配置DespatcherServlet
- 配置路徑:WebContent/WEB-INF/web.xml
- 配置內容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>springmvctest</display-name>
<servlet>
<!-- 值與servlet-mapping中servlet-name的值一致 -->
<servlet-name>mvctest</servlet-name>
<!-- 相應的jar包路徑,固定值 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 固定配置 -->
<param-name>contextConfigLocation</param-name>
<!-- applicationContext.xml文件路徑,classpath表示src路徑 -->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!-- 表示這個servlet加載優先級,數字越小,優先級越高;
另外這個servlet會在項目啓動的時候就加載,如果沒有這行,則在實際觸發的時候執行 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 值與servlet中servlet-name的值一致 -->
<servlet-name>mvctest</servlet-name>
<!-- 請求類型以.do結尾的都會走這個servlet -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
三、示例jsp文件:hello.jsp
- 新建hello.jsp,路徑:WebContent/WEB-INF/hello.jsp
- hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>spring mvc 入門示例</h2>
<h3>${msg }</h3>
</body>
</html>
四、編寫Controller類
- 新建HelloController類,目錄:cn/springmvc/controller/HelloController.java
- Controller類必須繼承Controller類
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/**
* controller必須繼承Controller
* @author ZJ
*
*/
public class HelloController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse respone) throws Exception {
// ModelAndView mav = new ModelAndView();
// mav.setViewName("hello");//設置視圖名字,調用這個類的時候就會把這個類的返回值,傳遞給名字爲hello的視圖
ModelAndView mav = new ModelAndView("hello");//以上兩步合一步,效果一樣
mav.getModel().put("msg", "向頁面傳遞一個值");
return mav;
}
}
五、在applicationContext.xml中配置HandlerMapping
<!-- 配置HandlerMapping,class路徑爲jar包路徑,並且路徑不能換行-->
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- name="mappings"爲固定值,不可改變 -->
<property name="mappings">
<props>
<!-- key:請求localhost:8080/springmvctest/hello.do中的hello.do value:Controller的id值 -->
<prop key="hello.do">helloController</prop>
</props>
</property>
</bean>
六、在applicationContext.xml中配置Controller
<!-- 配置Controller -->
<bean id="helloController" class="cn.springmvc.controller.HelloController"></bean>
七、在applicationContext.xml中配置ViewResolver
<!-- 配置ViewResolver,class路徑爲jar包路徑,並且路徑不能換行 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 視圖的位置前半部分 -->
<property name="prefix" value="/WEB-INF/"/>
<!-- 視圖的格式 -->
<property name="suffix" value=".jsp"/>
</bean>
到此以上已經能夠通過Spring MVC實現hello頁面的展示,效果如圖所示
以下將介紹:使用註解配置實現以上功能
新建web工程,引入jar包,加入配置文件applicationContext.xml
一、配置DispatchServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>springmvctest01</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
二、在applicationContext.xml中配置HandleMapping
<!-- 配置HandleMapping -->
<mvc:annotation-driven/>
三、在applicationContext.xml中配置Controller
<!-- 配置Controller -->
<context:component-scan base-package="cn.springmvc.controller"/>
四、在applicationContext.xml中配置ViewResolver
<!-- 配置ViewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
五、創建hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Spring MVC 註解版
${msg }
</body>
</html>
六、創建Controller類
package cn.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping("/hello.do")
public ModelAndView execute() {
ModelAndView mav = new ModelAndView("hello");
mav.getModel().put("msg", "向頁面傳遞一個值");
return mav;
}
}
到此以上通過Spring MVC 註解實現hello頁面的展示,效果如圖所示
以下將介紹:Controller如何接收請求參數
創建login.jsp,請求參數爲username, password
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h2>用戶登陸</h2>
<form action="checkLogin.do" method="post">
用戶名:<input type="text" name="username"><br/>
密 碼:<input type="text" name="password"><br/>
<input type="submit" value="登陸">
</form>
</body>
</html>
創建ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>登陸成功</h2>
</body>
</html>
一、通過HttpServletRequest
創建LoginController.java
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
@RequestMapping("/checkLogin.do")
//通過HttpServletRequest接收請求參數
public String checkLogin(HttpServletRequest request) {
if("root".equals(request.getParameter("username"))
&& "1234".equals(request.getParameter("password"))) {
return "ok";
}
return "login";
}
}
二、利用業務方法參數
–方法參數名與請求參數key保持一致
–利用@RequestParam(“key”)
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class LoginController {
//利用業務方法參數,方法參數名必須與請求參數的key保持一致,
//不一致的情況下可以通過@RequestParam("key")
@RequestMapping("/checkLogin1.do")
public String checkLogin1(@RequestParam("username")String name, String password) {
if("root".equals(name) && "1234".equals(password)) {
return "ok";
}
return "login";
}
}
三、利用實體對象當方法參數
創建實體對象User
package cn.springmvc.entity;
public class User {
//屬性必須和請求參數保持一致
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
創建LoginController.java
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import cn.springmvc.entity.User;
@Controller
public class LoginController {
//利用實體對象當方法參數
@RequestMapping("/checkLogin2.do")
public String checkLogin(User user) {
if("root".equals(user.getUsername()) && "1234".equals(user.getPassword())) {
return "ok";
}
return "login";
}
}
使用建議:
少量參數使用二;
大量參數使用三;
如果客戶端表單數據沒有格式檢查,遇到非字符串類型參數建議使用一
以下將介紹:Controller如何向響應JSP傳值
ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
controller向jsp傳遞的值:${msg }
<h2>登陸成功</h2>
</body>
</html>
一、利用HttpServletRequest
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import cn.springmvc.entity.User;
@Controller
public class LoginController {
@RequestMapping("/checkLogin.do")
//通過HttpServletRequest接收請求參數
public String checkLogin(HttpServletRequest request) {
if("root".equals(request.getParameter("username"))
&& "1234".equals(request.getParameter("password"))) {
//利用HttpServletRequest向頁面傳遞值
request.setAttribute("msg", request.getParameter("username"));
return "ok";
}
return "login";
}
}
二、利用ModelAndView做返回值
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import cn.springmvc.entity.User;
@Controller
public class LoginController {
//利用ModelAndView做返回值,向頁面傳遞值
@RequestMapping("/checkLogin3.do")
public ModelAndView checkLogin(String username, String password) {
ModelAndView mav = new ModelAndView();
if("root".equals(username) && "1234".equals(password)) {
mav.setViewName("ok");
mav.getModel().put("msg", username);
}else {
mav.setViewName("login");
}
return mav;
}
}
三、利用ModelMap方法參數
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.ui.ModelMap;
import cn.springmvc.entity.User;
@Controller
public class LoginController {
//利用ModelMap方法參數,向頁面傳遞參數
@RequestMapping("/checkLogin4.do")
public String checkLogin4(String username, String password, ModelMap model) {
if("root".equals(username) && "1234".equals(password)) {
model.put("msg", username);
return "ok";
}
return "login";
}
}
四、使用session來保存數據
package cn.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import cn.springmvc.entity.User;
@Controller
public class LoginController {
//使用session來保存數據,向頁面傳遞參數
@RequestMapping("/checkLogin4.do")
public String checkLogin4(String username, String password, HttpSession session) {
if("root".equals(username) && "1234".equals(password)) {
session.setAttribute("msg", username);
return "ok";
}
return "login";
}
}
練習:列表展示
創建:ListController.java
package cn.springmvc.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import cn.springmvc.entity.User;
@Controller
public class ListController {
@RequestMapping("/list.do")
public ModelAndView listShow() {
List<User> list = new ArrayList<User>();
for(int i=0;i<10;i++) {
User user = new User();
user.setUsername("root"+i);
user.setPassword("0000"+i);
list.add(user);
}
ModelAndView mav = new ModelAndView("list");
mav.getModel().put("list", list);
return mav;
}
}
創建list.jsp,
注意:使用<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>這個標籤,需要在WEB-INF/lib下引入jstl.jar, standard.jar
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>成員列表</h2>
<table>
<tr>
<td>姓名</td>
<td>密碼</td>
</tr>
<c:forEach items="${list }" var="user">
<tr>
<td>${user.username }</td>
<td>${user.password }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
展示結果: