一、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>
展示结果: