发表于: 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入门




返回列表 返回列表
评论

    分享到