发表于: 2017-10-09 23:03:00
1 1357
今日任务:
一上来弄了个天坑,定义rest接口格式.看了一下午只看了个大概,先跳开始spring mvc 之旅
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的.而MVC的引入,也就正式替代了Servlet.
下图为Spring mvc的工作整体流程,最最最核心的控制器称为,Dispatcher Servlet--前端控制器!
第一步:用户发送请求至DispatcherServlet前端控制器
第二步:DispatcherServlet前端控制器收到请求调用HandlerMapping处理器映射器查找Handler处理器
可以根据xml配置、注解进行查找
第三步:HandlerMapping处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(即HandlerExecutionChain执行链)并返回给DispatcherServlet前端控制器。
第四步:DispatcherServlet前端控制器通过HandlerAdapter处理器适配器调用Handler处理器
第五步:HandlerAdapter处理器适配器去执行Handler处理器(Controller,也叫后端控制器)。
第六步:Handler处理器执行完成给HandlerAdapter处理器适配器返回ModelAndView
第七步:HandlerAdapter处理器适配器将Handler处理器执行结果ModelAndView返回给DispatcherServlet前端控制器
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:DispatcherServlet前端控制器将ModelAndView传给ViewReslover视图解析器
根据逻辑视图名解析成真正的视图(jsp)
第九步:ViewReslover视图解析器向DispatcherServlet前端控制器返回View
第十步:DispatcherServlet前端控制器对View进行渲染视图(即将模型数据填充至视图中)。
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:DispatcherServlet前端控制器向用户响应结果
做一个简单的入门,创建web项目后对web.xml文件进行配置,这里注意,在配置中不添加指定Spring mvc的配置文件,默认的路径为
/WEB-INF/<servlet-name>(←这个是自己定义的)-servlet.xml.
<?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_2_5.xsd"
version="2.5">
<!--注册核心控制器!-->
<servlet>
<servlet-name>firstSpring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--手动定义sprngmvc配置文件路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>firstSpring</servlet-name>
<!--拦截路径这里设置了拦截全部-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
编写Controller后端处理器,ModelAndView 分为两部分:model和view。model负责参数,view就是视图,也就是页面。相当于统一了Model对象和View对象的功能 modelAndView.setViewName()相当于往指定页面进行跳转, modelAndView.addObject()相当于设置需要返回的值-以键值对保存
public class Hi implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("hello","HI你成功了!");
modelAndView.setViewName("index.jsp");
return modelAndView;
}
}
这里向前台页面传参,设置键值对,配置完后将该处理器访问方式添加到我自己配置的springmvc.xml文件中
前台做一个简单的接受页面
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<body>
<h2 align="center">Hello World!</h2>
<h3 align="center">${hello}</h3>
</body>
</html>
这里在测试时因从后台传出数据在前台显示时出现中文乱码,使用了编码过滤器
<!-- 解决工程编码过滤器 -->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但这里我没有配置映射器,适配器和视图解析器,因为spring mvc中存在着默认解析器,
这里说下应用最广泛的视图解析器InternalResourceViewResolver,InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp,然后请求的Controller处理器方法返回的视图名称为test,那么这个时候InternalResourceViewResolver就会把test解析为一个InternalResourceView对象,先把返回的模型属性都存放到对应的HttpServletRequest属性中,然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/test.jsp。这就是InternalResourceViewResolver一个非常重要的特性,我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。
下面是一个InternalResourceViewResolver的定义,根据该定义当返回的逻辑视图名称是test的时候,InternalResourceViewResolver会给它加上定义好的前缀和后缀,组成“/test.jsp”的形式,然后把它当做一个InternalResourceView的url新建一个InternalResourceView对象返回。
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
Controller处理器修改为
public class Hi implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("hello","HI你成功了!");
modelAndView.setViewName("index");
return modelAndView;
}
}
这里测试成功
明日计划:开始学习spring mvc注解,rest继续
问题:what is the **** rest!
收获:基本的spring mvc入门
评论