SpringMVC学习
执行流程
- DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心,用户发出请求,DispatcherServlet接收请求并拦截请求
- 假设URL为:http://localhost:8080/SpringMVC/hello
- 如上URL拆分为三部分
- http://localhost:8080服务器域名
- SpringMVC部署在服务器上的web站点
- hello表示控制器
- 通过分析,url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器
- HandlerMapping为处理器映射,DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler
- HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器
- HandlerExecution将解析后的信息传递给DispatcherServlet
- HandlerAdapter表示处理适配器,其按照特定的规则去执行Handler
- Handler让具体的Controller执行
- Controller将具体的执行信息返回给HandlerAdapter
- HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
- DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名
- 视图解析器将解析的逻辑视图名传给DispatcherServlet
- DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图
- 最终视图呈现给用户
基于XML实现
1.引入相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</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>2.创建类
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
//业务代码
String result = "你好,我是MVC";
mv.addObject("msg",result);
//视图跳转
mv.setViewName("test");
return mv;
}
}3.配置web.xml文件
<!--配置DispatcherServlet,这个是sptingmvc的核心-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatcherServlet要绑定的spring配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别:1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
springmvc中, / /*
/:只匹配所有的请求,不会去匹配jsp页面
/*:匹配所有的请求,包括jsp页面
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>4.配置springmvc-servlet.xml文件
<!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--处理器解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--创建对象-->
<bean id="/hello" class="org.learn.demon.HelloController"/>5.创建jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>6.配置Tomcat服务器
添加服务器之后,到工程结构,浏览tomcat打包的war包中有没有lib文件,没有就创建一个,把所有需要的jar包放进去
7.运行结果
浏览器输入/hello显示:你好,我是MVC界面
四、基于注解实现
1.导入依赖
同三、->1.依赖配置相同
2.编写web.xml配置文件
<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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>3.编写spring配置文件
- mvc:default-servlet-handler:使springmvc不处理静态资源 .css .js .mp4 .html .mp3
- mvc:annotation-driven:支持mvc注解驱动,spirng中一般采用@RequestMapping注解完成映射关系,要想使注解生效,就需要配置DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例,这两个实例分别在类级别和方法级别处理,而annotation-driven可以帮我们自动完成上面的配置
- 配置视图解析器,prefix为前缀,suffix为后缀
<context:component-scan base-package="org.learn.demon"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>4.创建对应的控制类
@Controller
public class HelloController {
@RequestMapping("/h1")
public String hello1(Model model){
//向模型中添加属性msg与值,可以在jsp页面中取出并渲染
model.addAttribute("msg","Hello 你好");
return "hello";
}
}5.完善前端视图和controller之间的关系
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>6.运行调试
五、注解说明
1.@Controller
被这个注解的类中的所有的方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析。
—注意:返回的字符串如果没有组成页面跳转拼接成的正确的URL,那么就会报错404
2.@RequestMapping
用于映射url到控制器类或一个特定的处理程序方法,可用于类或方法上。在类上,表示类中的所有请求的方法都是以该地址作为父路径
1.method方法属性值
RequestMethod.GET
RequestMethod.POST
RequestMethod.DELETE……
可以点击method方法进入详细查看
以上所有的method都可以直接写为一个单独的注解(例如:@PostMapping(value=“url地址”) 或 @GetMapping(value=“url地址”) 等等)
2.@PathVariable
让方法参数中的值对应绑定到一个URL模板变量上
加入该注解后,方法中的变量可以使URL地址发生改变,RequestMapping中value中的值就可以写为类似"/login/{a}/{b}“的方式
六、详解
1.RESTFUL风格
通过不同的请求方式来实现不同的效果(同一个URL地址,不同的请求方式结果不同)
2.转发和重定向
return里面默认写字符串即为转发,字符串里面写上redirect:页面路径即可重定向页面(例:“redirect:/index.jsp”)
3.接收请求参数及数据回显
- 接收前端用户传递的参数,判断参数的名字,假设名字直接在方法上,可以直接使用
- 假设传递的是一个对象User,匹配User对象中的字段名;如果字段名一致则接收,否则,匹配不到
4.数据回显方式区别
Model:只有几个方法适用于存储数据
ModelMap:继承了LinkedMap,除了实现了自身的一些方法,同样继承了LinkedMap的方法和特性
ModelAndView:在存储数据的同时,进行设置返回的逻辑视图,进行控制层的跳转
5.乱码问题
在web.xml文件中配置spring过滤器
注意这里映射需要设置/*,因为需要匹配jsp页面
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>或者tomcat服务器中conf文件夹下server.xml文件中添加编码格式
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8"/>七、JSON
一、概念
1.什么是json
- JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式
- 采用完全独立于编程语言的文本格式来存储和表示数据
- 简洁和清晰的层次结构使得JSON成为理想的数据交换语言
- 易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率
2.语法
- 对象表示为键值对,数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
3.配置依赖
maven中添加jackson依赖(或者fast-json也可以)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>4.创建类
添加@ResponseBody注解,返回json字符串,创建ObjectMapper对象,接收json字符串
@RequestMapping(value = "/t1")
@ResponseBody
public String test1() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
User user = new User("路飞",1,20);
String str = mapper.writeValueAsString(user);
return str;
}5.乱码处理
在spirng配置文件中配置
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>6.@RestController和@ResponseBody注解
- @RestController作用在类上,代替@Controller,使用该注解默认该类返回的都是json字符串,不会被视图解析器解析
- @ResponseBody作用在方法上,配合@Controller使用,被该注解注解的方法返回json字符串,不会被视图解析器解析
AzurTian的博客