#SpringMVC终极一篇,
一、优点
- 轻量级,简单易学
- 很高效
- 兼容性强,功能强大
- 功能强大,restful,数据验证,格式化
- 用的人多!
二、执行原理
2.1、普通servlet时代
流程:servlet类处理前端请求,取得前端参数,有多少取多少,然后处理业务,最后转发或者重定向到前端某个页面,看着步骤很简单,但是很繁琐!
比如:一个小网站下来,你会发现有很多个servlet,web.xml里面会很臃肿!
根本不利于团队开发!最重要的还是前端传递参数问题,写过的小伙伴可能深有体会,十servlet获取前端参数,然后还要封装,不小心字段写错了又很难发现!
2.2、Springmvc中心控制器
springweb框架围绕DispatchServlet设计,将请求分发给不同的处理器,配合上注解,简直爽的飞起!DisptchServlet实际上也是一个Servlet,只是功能更强大罢了!
直接上流程图!
- 当浏览器发起请求被DispatchServlet拦截,根据请求参数生成代理请求,找到对应的实际控制器,处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,经过视图渲染,返回结果给浏览器!
具体解析:
HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
Handler让具体的Controller执行。
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
视图解析器将解析的逻辑视图名传给DispatcherServlet。
DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
最终视图呈现给用户。
三、实例、
文字太难懂,配合上代码就容易理解了!
来:先基础准备、创建一个简单的表,编写实体类,(相信这些不用演示)
然后,
1、 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>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2、编写springmvc配置文件
<!-- 处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" id="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="com.song.controler.UserController"></bean>
3、controller、
public class UserController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("cc","hello");
mv.setViewName("hello");
return mv;
}
}
很麻烦,看注解版如何简单:
注解版本
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">
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:aplicationcontext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>ecoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ecoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
其中:/和/*有区别前者不会匹配到.jsp后缀请求,后者会,
不打算详细写了,列举一下会用到注解吧
@Controller//表示它下面的类是个是个控制类
@RestController//表示他是个返回体的控制类,赋值返回数据,例如json数据等,主要用于配合ajax等请求以及结合前端框架的数据
@Autowired//自动装配service层的bean,
@RequestMapping//请求路径
@ResponseBody//说明在他之下的方法是返回数据格式不是跳转页面,不经过试图解析器
差不多就这些
四、拦截器
java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。
1、编写拦截器
public class UserInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getSession().getAttribute("user")!=null){
return true;
}else {
request.getRequestDispatcher("jsp/login.html").forward(request,response);
}
return false;
}
主要用来做登录拦截
spring-mvc.xml配置
<!-- 拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="UserInterceptor" class="com.song.filter.UserInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- spring mvc大概就这些重要的东西,主要还是看ssm如何整合使用,掌握执行原理,会用拦截器就差不多了,