SpringMVC
MVC
-
M model
数据模型,提供要展示的数据,因此包含数据行为,可以认为是领域模型或JavaBean组件(包含数据和行为)。也就是Dao层和Service层。
-
V view
负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
-
C Controller接受用户请求,委托给模型进行处理,处理完之后把返回的模型数据返回给视图,由视图负责展示,也就是说控制器做了个调度员的工作。
- 用户发请求
- Servlet请求接受数据,并调用对应的业务逻辑
- 业务处理完毕,返回更新后的数据给Servlet
- servlet转向给JSP,由JSP来渲染页面
- 响应给前端更新后的页面
-
Controller
取得表单数据
调用业务逻辑
转向指定的页面
-
Model
业务逻辑
保存数据的状态
-
View
展示给客户的页面
SpringMVC的执行流程
springmvc中的有一个DispatcherServlet代替了我们传统的web开发中Servlet的使用。
-
当我们在web.xml中配置好DispatcherServlet的时候,可以让所有的前端请求通过DispactherServlet.
<!--1.注册DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <!-- 上下文配置的位置 --> <param-name>contextConfigLocation</param-name> <!-- 对应的spring配置 --> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别-1 也就是服务器启动的时候这个也就启动了--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
通过DispactcherServlet的请求发送到HandlerMapping(处理映射器)中,HandlerMapping找到对应的注册的bean对象(对应的url 和 对应的类) 然后返回给DispactcherServlet
<!-- 配置处理映射器 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- url注册对应的Controller对象--> <bean id="/hello" class="com.li.mvc.HelloController"/>
-
DispactcherServlet得到对应的类的位置 然后告诉给HandlerAdapter(处理适配器)中,处理适配器找到对应的Controller接口,然后去执行对应的Service方法,并且将返回的结果(ModelAndView)交给DispactcherServlet。
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
package com.li.mvc; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //模型和视图 ModelAndView mv = new ModelAndView(); //封装对象,放在ModelAndView中 Model中 mv.addObject("msg", "HelloSpring"); //封装要跳转的视图,放在ModelAndView中 mv.setViewName("hello"); return mv; } }
-
DispactcherServlet得到对应的ModelAndView(也就是数据和页面),然后找到ViewResolver(视图解析器),根据视图解析器来返回对应的页面。
<!-- 添加视图解析器--> <!--视图解析器:DispatcherServlet给他的ModelAndView--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀 要知道自己的静态文件在哪里放着的位置--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀 一般就是 .jsp .html之类的 --> <property name="suffix" value=".jsp"/> </bean> <!-- url注册对应的Controller对象--> <bean id="/hello" class="com.li.mvc.HelloController"/>
SpringMVC的注解开发的配置
-
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"> <!--1.注册DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <!-- 上下文配置的位置 --> <param-name>contextConfigLocation</param-name> <!-- 对应的spring配置 --> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别-1 也就是服务器启动的时候这个也就启动了--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
DispatcherServlet中contextConfigLocation对应的classPath中的配置
<?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="com.li.controller"/> <!-- 过滤静态资源--> <mvc:default-servlet-handler/> <!--处理映射器和处理适配器 --> <mvc:annotation-driven/> <!-- 添加视图解析器--> <!--视图解析器:DispatcherServlet给他的ModelAndView--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> </beans>
-
直接使用@Controller和@RequestMapping来进行对业务的实现
RestFul开发风格
@GetMapping("/t1/{p1}/{p2}")
public String test(@PathVariable String p1,@PathVariable String p2 , Model model){
String ret = p1+p2;
model.addAttribute("msg", ret);
return "test";
}
@RequestMapping(value = "/t2/{p1}{p2}",method = RequestMethod.GET)
public String test2(@PathVariable int p1, @PathVariable int p2, Model model) {
int ret = p1+p2;
model.addAttribute("msg", ret);
return "test";
}
@GetMapping("/t3")
public String test3(@RequestParam("username") String name, Model model) {
String s = name;
model.addAttribute("msg", s);
return "test";
}
@GetMapping("/t4")
public String test3(User user, Model model) {
model.addAttribute("msg", user.toString());
return "test";
}
Spring自动配置过滤器解决乱码问题
向web.xml文件中添加过滤器的配置
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring中的JSON
-
pom.xml的配置
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
-
JSON的应用
package com.li.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.li.pojo.User; import com.li.utils.JSONTIME; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.text.SimpleDateFormat; import java.util.Date; //json字符串不走视图过滤器 @RestController public class JsonController { @RequestMapping("/t1") public String json1() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); // 不使用时间戳的方式 //mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // 自定义日期的格式 SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); mapper.setDateFormat(sdf); Date date = new Date(); return mapper.writeValueAsString(date); } @RequestMapping("/t2") public String json2() throws JsonProcessingException { Date date = new Date(); return JSONTIME.getTimeJson(date); } @RequestMapping("/t3") public String json3() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); User user = new User(1, "李世举", "宝贝"); return mapper.writeValueAsString(user); } }
-
alibaba下的fastJson
-
pom.xml的配置
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency>
-
-
fastJson的应用
package com.li.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.li.pojo.User; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class JsonFastController { @RequestMapping("/t4") public String json3() throws JsonProcessingException { User user = new User(1, "李世举", "宝贝"); // JAVA对象转换成json字符串 String str1 = JSON.toJSONString(user); // json字符串转化成java对象 User u2 = JSON.parseObject(str1, User.class); // JAVA对象转化成JSON对象 JSONObject jb = (JSONObject) JSON.toJSON(u2); // JSON对象转化成JAVA对象 User u3 = JSON.toJavaObject(jb, User.class); return str1; } }