目录
1、SpringMVC
1.1、回顾MVC架构
MVC是模型(Model) 、视图(View) 、控制器(Controller) 的缩写,是一种软件设计规范。
Model : javaBean (1.处理业务逻辑,2. 封装数据)
View: 视图 jsp/html(展示数据)
controller: 控制器 (1.接收请求,2.调用模型,3.转发视图)
MVC是将业务逻辑、数据、显示进行分离的方式来组织代码。MVC主要作用是降低了视图与业务逻辑间的耦合度。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在一些差异!
1.2、SpringMVC概述
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。它可以通过一套注解,让一个简单的Java类成为控制器,而无须实现任何接口。
简单一句话:SpringMVC简化Servlet的开发!!,SpringMVC主要解决web层的代码,本质是Servlet。
1.3、SpringMVC的特点
1、轻量级,简单易学。
2、高效 , 基于请求响应的MVC框架。
3、与Spring兼容性好,无缝结合。
4、约定优于配置(SpringBoot)。
5、功能强大:RESTful、数据验证、格式化、本地化、主题等。
6、简洁灵活。
1.4、SpringMVC整体架构
主要组件有五个:
前端控制器(DispatcherServlet):只负责接收和响应
处理器映射器(HandlerMapping):根据请求的url查找对应的处理器
处理器(Handler):程序员自己定义的处理器
处理器适配器(HandlerAdpter):对处理器handler进行执行
视图解析器(ViewResvoler):进行视图解析,返回的数据,进行处理,可以解析成对应的页面信息
1、用户发起请求到控制器 DispatcherServlet(前端控制器)
2、前端控制器去handlerMapper查找Handler对象
3、HandlerMapper返回HandlerExecutorChain 执行链(包含两部分内容:Handler ,拦截器集合)
4、前端控制器,通过HandlerAdapter 适配器执行 Handler对象
5、Handler处理具体的业务逻辑
6、Handler处理完业务逻辑之后,返回ModelAndView 其中的View是视图名称
7、将ModelAndView返回前端控制器
8、前端控制器,通过ModelAndView 中的视图名称。在视图解析器中查找视图
9、返回真正的View 视图对象
10、渲染视图
11、返回用户响应
2、SpringMVC快速入门
2.1、创建一个web工程
创建的maven web工程
2.2、导入依赖坐标
<!--springmvc依赖包,springmvc 只有这一个包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!--serlvet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
2.3、tomcat插件
<build>
<plugins>
<!--添加tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
点击右上角的Add Configuration
点击左上角的+号,选择下面的Maven添加,在后面的配置栏中填写tomcat7:run后应用ok
2.4、配置DispatcherServlet前端控制器
在web.xml配置文件中进行配置DIspatcherServlet前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!--前端控制器-->
<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:springmvc-servlet.xml</param-value>
</init-param>
<!--指定servlet在tomcat启动时创建-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
*.do 匹配后缀
/ 请求不了 html,js,css,img
/* 只能访问controller请求
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
2.5、SpringMVC核心配置文件
配置springmvc-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"
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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--HandlerMapping 映射器 springmvc会自己配置无需配置 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--HandlerAdapter 适配器 springmvc会自己配置无需配置-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--配置自定义的handler controller-->
<bean name="handler" class="cn.itssl.controller.Hello"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.6、创建页面
根据前缀创建一个对应位置的页面hello.jsp,注意:这里的视图名一定要和自定义Headler里setViewName方法中写的名字一致,因为前端控制器会根据这个视图名去寻找页面后进行数据回显。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
2.7、自定义Headler(Controller)
创建一个Hello类去实现Controller接口,并重写里面的方法handleRequest。
public class Hello implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","这是第一个springmvc程序!!");
//设置视图名 hello仅仅是视图的名字
mv.setViewName("hello");
return mv;
}
}
注意:这里的setViewName里面填写的名字就是视图名,会自动为我们进行拼接前缀和后缀,因为在配置文件中我们进行了配置,所以它最后请求的路径即为:localhost:8080/hello.do,这里的.do是我在web.xml中的url-pattern中配置的匹配后缀,跟拼接后缀.jsp没有任何关系。
3、注解开发
入门案例中的思考:
1、每个类需实现Controller,麻烦
2、每个类只能处理一个业务逻辑,不能是controller处理多个业务逻辑。
3、每一个Controller都需要进行配置
使用注解:解决上述问题
学会了使用xml配置文件后,总觉得太过于麻烦,那么注解开发可以很简单的进行,省略了xml配置的繁琐。
3.1、创建Controller类
@Controller//注解声明这是一个Controller类
@RequestMapping("/hello")
public class Hello2 {
//标准映射 value可以省略不写,以及/也可省略不写
@RequestMapping(value = "/show")
public ModelAndView test1(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是第一个springmvc注解!!");
mv.setViewName("hello");
return mv;
}
}
配置核心配置文件(开启注解扫描和开启springMVC注解驱动)
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描包下的注解-->
<context:component-scan base-package="cn.itssl.*"/>
<!--开启注解驱动-->
<mvc:annotation-driven/>
</beans>
启动tomcat服务器测试
4、五种映射
4.1、标准映射
//标准映射
@RequestMapping(value = "/show")
public ModelAndView test1(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是第一个springmvc注解!!");
mv.setViewName("hello");
return mv;
}
4.2、Ant风格url映射
//Ant风格url映射
@RequestMapping("/test/*/show2")
public ModelAndView test2(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是第一个springmvc注解!!2222");
mv.setViewName("hello");
return mv;
}
多级目录可以写单级目录
//多级目录可以写单级目录
@RequestMapping("/test/**/show3")
public ModelAndView test3(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是第一个springmvc注解!!2222");
mv.setViewName("hello");
return mv;
}
4.3、占位符映射
@RequestMapping(“/user/{userId}/query")
通过@PathVariable(“xxx”) 获取请求路径中参数值
//占位符映射
@RequestMapping("/show4/{itemId}/{name}")
public ModelAndView test4(@PathVariable("itemId") String itemId,@PathVariable("name") String name){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","itemId:"+itemId+" name:"+name);
mv.setViewName("hello");
return mv;
}
4.4、限定请求方式映射
RequestMethod.POST @PostMapping("xx")
RequestMethod.GET @GetMapping("xx")
//限制请求方式映射
//post请求方式
@RequestMapping(value = "/show5",method = RequestMethod.POST)
public ModelAndView test5(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是指定了post请求方式");
mv.setViewName("hello");
return mv;
}
//限制请求方式映射
//get请求方式
@RequestMapping(value = "/show6",method = RequestMethod.GET)
public ModelAndView test6(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是指定了get请求方式");
mv.setViewName("hello");
return mv;
}
//限制请求方式映射
//post/get请求方式 @RequestMapping默认
@RequestMapping(value = "/show7",method = {RequestMethod.GET,RequestMethod.POST})
public ModelAndView test7(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是指定了get/post请求方式");
mv.setViewName("hello");
return mv;
}
以上方式可由下面替代
@GetMapping("show8")
public ModelAndView test8(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是指定了get请求方式");
mv.setViewName("hello");
return mv;
}
@PostMapping("show9")
public ModelAndView test9(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","这是指定了post请求方式");
mv.setViewName("hello");
return mv;
}
4.5、限定请求参数
可以防止用户把不必要的信息注入进来
@GetMapping(value = "show15",params = "id") 必须包含id
@GetMapping(value = "show15",params = "!id") 不能包含id
@GetMapping(value = "show15",params = "id!=1007") 包含id其值不为1007
//请求参数必须包含id 方式一
@GetMapping(value = "show10",params = "id")
public ModelAndView test10(@RequestParam("id") int id){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","限定请求参数:"+id);
mv.setViewName("hello");
return mv;
}
//请求参数必须包含id 方式二
@GetMapping(value = "show11")
public ModelAndView test11(@RequestParam("id") int id){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","限定请求参数:"+id);
mv.setViewName("hello");
return mv;
}
//请求参数不包含id
@GetMapping(value = "show12",params = "!id")
public ModelAndView test12(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","非id参数");
mv.setViewName("hello");
return mv;
}
//请求参数包含id其值不能为1007
@GetMapping(value ="show13",params = "id!=1007")
public ModelAndView test13(@RequestParam("id") int id){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","限定请求参数:"+id);
mv.setViewName("hello");
return mv;
}
5、SpringMVC页面跳转
5.1、返回字符串
@Controller
@RequestMapping("hello3")
public class Hello3 {
@RequestMapping("show1")
public ModelAndView show1(){
//第一种 ModelAndView 转发到视图解析器
return new ModelAndView("hello");
}
//第二种 String 转发到视图解析器
@RequestMapping("show2")
public String show2(){
return "hello";
}
//第三种 void 没有返回的视图
@RequestMapping("show3")
@ResponseStatus(HttpStatus.OK)
public void show3(){
System.out.println("我没有要返回的结果..");
}
//第四种 转发--通过servlet内置对象
@RequestMapping("show4")
public void show4(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request,response);
}
}
5.2、转发(forward关键字)
//第一种 转发--webapp 页面
@RequestMapping("show5")
public String show5(){
return "forward:/user.html";
}
//第二种 转发--webapp controller类
@RequestMapping("show6")
public String show6(){
return "forward:/hello/show.do";
}
//第三种 转发--ModelAndView
@RequestMapping("show7")
public ModelAndView show7(ModelAndView mv){
mv.setViewName("forward:/user.html");//webapp下的页面
return mv;
}
//第三种 转发--ModelAndView
@RequestMapping("show8")
public void shiw8(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/user.html").forward(request,response);
}
5.3、重定向(redirect关键字)
此关键字的底层:response.sendRedirect("web项目地址+重定向地址");
@Controller
@RequestMapping("hello4")
public class Hello4 {
//第一种 重定向 redirect关键字
@RequestMapping("show1")
public String show1(){
return "redirect:/user.html";//重定向webapp下的具体页面
}
//第二种 重定向 ModelAndView
@RequestMapping("show2")
public ModelAndView show2(ModelAndView mv){
mv.setViewName("redirect:/user.html");
return mv;
}
//第三种 重定向 绑定servlet内置对象
@RequestMapping("show3")
public void show3(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.sendRedirect(request.getContextPath()+"/user.html");
}
}
6、SpringMVC存储数据
在webapp包下创建list.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
姓名:
${requestScope.name}
城市:
${requestScope.city}
年龄:
${requestScope.age}
</body>
</html>
6.1、servlet存储数据
@Controller
@RequestMapping("test")
public class ServletTest {
@RequestMapping("requestAPI")
public void requestAPI(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name","itssl");
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
}
6.2、Model存储数据
//方式一 ModelAndView存数据
@RequestMapping("modelAndViewTest")
public ModelAndView modelAndViewTest(ModelAndView mv){
mv.addObject("name","jack");
mv.setViewName("list");
return mv;
}
//方式二 Model
@RequestMapping("TestModel")
public String modelAndViewTest2(Model model){
model.addAttribute("name","rose");
return "forward:/list.jsp";
}
//方式三 ModelMap
@RequestMapping("TestModelMap")
public String modelAndViewTest3(ModelMap modelMap){
modelMap.addAttribute("city","zhengzhou");
return "forward:/list.jsp";
}
//方式四 Map
@RequestMapping("TestMap")
public String modelAndViewTest4(Map<Object,Object> map){
map.put("age",21);
return "forward:/list.jsp";
}