springMVC
1:配置与流程
1:DispatcherServlet
前置控制器,前端请求拦截器,Http拦截器,配置在web.xml中,拦截前端请求
<!--配置到springring容器中-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--启动顺序,越小优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--拦截前端请求-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2:HandlerMapping
处理映射器,DispatcherServlet,选择合适的映射器,讲前端请求交给合适的控制器来(Controller)处理,配置在dispatcher-servlet.xml,并且注入到ioc
<!--在ioc注册映射器-->
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- /hello 路径的请求交给 id 为 helloController 的控制器处理-->
<prop key="/hello">helloController</prop>
</props>
</property>
</bean>
3:Controller
控制器,处理DispatcherServlet递送过来的请求,代码逻辑区域,在dispatcher-servlet.xml中注册到ioc
<!--在ioc注册控制器-->
<bean id="helloController" class="controller.HelloController"></bean>
4:ModelAndView
模型和视图,处理控制器的模型(数据)和视图(逻辑视图名字,jsp…),并将*模型和视图名发送给DispatcherServlet
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
// 处理逻辑
....
// 返回给 DispatcherServlet
return mav;
}
5:ViewResolver
视图解析器,为返回到DispatcherServlet 中的逻辑视图,匹配合适的物理视图(jsp…)
6:View
视图,通过View对象的render()方法进行视图渲染,得到页面
2:入门使用
1:配置式
1: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_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置到springring容器中-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--启动顺序-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--拦截前端请求-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2:dispatcher-servlet.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--在ioc注册映射器-->
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- /hello 路径的请求交给 id 为 helloController 的控制器处理-->
<prop key="/hello">helloController</prop>
</props>
</property>
</bean>
<!--在ioc注册控制器-->
<bean id="helloController" class="controller.HelloController"></bean>
</beans>
3:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
4:controller
package controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mav = new ModelAndView("index.jsp");
mav.addObject("message", "Hello Spring MVC"); return mav;
}
}
2:注解式
1: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_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置到springring容器中-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--启动顺序-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--拦截前端请求-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2:dispatcher-servlet.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"
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.xsd">
<!--组件扫描,针对注解-->
<context:component-scan base-package="controller"/>
</beans>
3:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
4:controller
package 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")
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mav = new ModelAndView("index.jsp");
mav.addObject("message", "Hello Spring MVC"); return mav;
}
}
3:优化式
1:ViewResolve详细配置
增强用户体验,防止信息泄露
<!--在dispatcher-servlet.xml配置视图解析器-->
<!--目的:在/WEB-INF/page/下存放所需视图文件,防止通过直接访问根目录,如localhost/index.jsp导致信息泄露-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
2:demo
1: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_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置到springring容器中-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--启动顺序-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--拦截前端请求-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2:dispatcher-servlet.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"
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.xsd">
<!--组件扫描,针对注解-->
<context:component-scan base-package="controller"/>
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
3:HelloController
package 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")
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello Spring MVC"); return mav;
}
}
4:index.jsp
<%--
Created by IntelliJ IDEA.
User: chenht
Date: 2020/7/13
Time: 8:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<h1>page</h1>
<title>page_hello</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
5:目录
3:数据交互
1:得到前端数据
目录
test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<h1>参数传递到控制器</h1>
<title>paramToController</title>
</head>
<body>
<form action="/param" role="form">
用户名:<input type="text" name="userName"><br/>
密码:<input type="text" name="password"><br/>
<input type="submit" value="提 交">
</form>
<h1>${message}</h1>
</body>
</html>
1:HttpServletRequest
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ParamController {
@RequestMapping("/param")
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
String userName = httpServletRequest.getParameter("userName");
String password = httpServletRequest.getParameter("password");
System.out.println(userName);
System.out.println(password);
ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello Spring MVC"); return mav;
}
}
2:同名匹配规则
耦合度高
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ParamController {
@RequestMapping("/param")
//userName =test.jsp中的userName,password =test.password
public ModelAndView handleRequest(String userName, String password) throws Exception {
System.out.println(userName);
System.out.println(password);
ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello Spring MVC"); return mav;
}
}
3:注解@RequestParam
package controller;
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;
@Controller
public class ParamController {
@RequestMapping("/param")
public ModelAndView handleRequest(@RequestParam("name") String userName,
@RequestParam("word") String password) throws Exception {
System.out.println(userName);
System.out.println(password);
ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello Spring MVC"); return mav;
}
}
value : name 属性的名称是什么,value 属性都可以默认不写
required :是否必须要有该参数,可以设置为【true】或者【false】
defaultvalue :设置默认值
4:模型传参
*要求=====前台参数名字必须和模型中的字段名一样*
package controller;
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 pojo.User;
@Controller
public class ParamController {
@RequestMapping("/param")
public ModelAndView handleRequest(User user) throws Exception {
System.out.println(user.getUserName());
System.out.println(user.getPassword());
ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello Spring MVC"); return mav;
}
}
2:展示后台数据
test2.jsp
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false" %>
<html>
<head>
<title>Spring MVC 数据回显</title>
</head>
<body>
<h1>回显数据:${message}</h1>
</body>
</html>
1:HttpServletRequest
RepsonseController
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class RepsonseController {
@RequestMapping("/value")
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
httpServletRequest.setAttribute("message","成功!");
return new ModelAndView("test2");
}
}
2:ModelAndView
RepsonseController
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class RepsonseController {
@RequestMapping("/value")
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv= new ModelAndView("test2");
httpServletRequest.setAttribute("message","成功!");
mv.setViewName("test2");
return mv;
}
}
3:Model
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class RepsonseController {
@RequestMapping("/value")
public String handleRequest(Model model) throws Exception {
model.addAttribute("message","成sssssssssssssssssssssssssss功!");
return "test2";
}
}
4:@ModelAttribute
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class RepsonseController {
@ModelAttribute
public void model(Model model) {
model.addAttribute("message", "wwwwwwwwwwwwwwwwwwww");
}
@RequestMapping("/value")
public String handleRequest() throws Exception {
return "test2";
}
}
这样写就会在访问控制器方法 handleRequest() 时,会首先调用 model() 方法将
message
添加进页面参数中去,在视图中可以直接调用,但是这样写会导致该控制器所有的方法都会首先调用 model() 方法,但同样的也很方便,因为可以加入各种各样的数据。
3:客户端跳转
前面不管是地址
/hello
跳转到 index.jsp 还是/test
跳转到 test.jsp,这些都是服务端的跳转,也就是request.getRequestDispatcher("地址").forward(request, response);
方式一
@RequestMapping("/jump")
public ModelAndView jump() {
ModelAndView mav = new ModelAndView("redirect:/value");
return mav;
}
方式二
@RequestMapping("/jump")
public String jump() {
return "redirect: ./hello";
}
4:处理乱码
针对post方法,同servlet,直接作用在request上
在web.xml中添加配置
<filter>
<filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5:上传文件
1:jar
注意: 需要先导入
commons-io-1.3.2.jar
和commons-fileupload-1.2.1.jar
两个包
2:web.xml配置
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
3:jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="picture">
<input type="submit" value="上 传">
</form>
</body>
</html>
4:controller
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class UploadController {
//接收uplode页面传递过来的数据,并进行业务逻辑
@RequestMapping(value = "/upload" ,method = {RequestMethod.POST})
public String upload(@RequestParam("picture") MultipartFile picture) throws Exception {
System.out.println(picture.getOriginalFilename());
//跳转到指定的url路径或者页面
return "redirect:/value";
// return "redirect:/index.jsp";
}
//跳转到uplode页面
@RequestMapping("/test2")
public ModelAndView upload() {
return new ModelAndView("upload");
}
}