springmvc(一)原理分析及配置前端控制器,处理器映射器,处理器适配器

springmvc是spring的一部分,是一个基于mvc设计模式的前端框架

工作流程

前端控制器(DispacherServlet):负责转发请求,接受用户的请求,申请处理后,将响应返回给客户

处理器映射器(HandlerMapping):前端控制器把请求转发给处理器映射器。处理器映射器根据请求中的URL,找到对应的Handler(相当于struts2的Action),返回给前端控制器。

处理器适配器(HandlerAdapter):前端控制器知道要执行哪个Handler,但是它只是把信息转发给处理器适配器,处理器适配器调用程序写好的Handler,Handler执行完,返回一个ModelAndView对象给适配器,处理器适配器再把这个对象返回给前端控制器

处理器(Handler):编写handler按照适配器的规则来编写,比如实现哪个接口,这样适配器才可以正确执行handler

视图解析器(View resolver):前端控制器会把逻辑视图发送给视图解析器请求解析,视图解析器处理后返图物理视图(view)给前端控制器

视图view:前端控制器请求进行视图渲染,把model数据填充到request域,返回视图(jsp、html等)

前端控制器把视图响应返回给用户

配置前端控制器

前端控制器就整个框架最中心的组件,负责组织其他组件正常工作,那既然是一个servlet,就在web.xml文件中配置,我们知道应用程序部署到tomcat上,web.xml是程序执行的入口点,所以我们要在这里配置我们的前端控制器,用来接收用户请求。类似于在学习struts2时,我们在web.xml里配置的filter,它的作用和这里的前端控制器类似。

那首先我们得配置springmvc的运行环境,就是导入所需要的jar包

主要多了两个包

 

 (1)配置servlet的名字和类

(2)配置inti-param参数,使得前端控制器找到处理器映射器和适配器等。默认会在WEB-INF目录下查找,并且要求配置文件的名字为servlet名字-servlet.xml。所以通过配置可以自己指定配置文件。我们在classpath下面创建config目录,里面新建springmvc.xml.

 

(3)配置servlet-mapping,通过url找到servlet。

  • <url-pattern>*.do</url-pattern>  根据后缀来找
  • <url-pattern>/</url-pattern> 所有url都会让这个前端控制器解析
  • <url-pattern>/*do</url-pattern>有错误,不能这样配置
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 控制器通过配置文件找到处理器映射器,处理器适配器,这些都配置在springmvc.xml文件中 -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springmvc.xml</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>

配置处理器适配器

配置好前端控制器,我们在springmvc.xml中配置处理器映射器。

(1)引入约束,与spring的配置文件约束一致

(2)在springmvc的xml配置适配器,也是以bean的形式配置

我们知道适配器是去执行Handler的,打开SimpleControllerHandlerAdapter源代码,有一个supports()方法,意思只有这个Handler是Controller对象时这个适配器才可以执行这个Handler,那么我们就根据这个规则编写Handler类

 

编写Handler 

 (1)创建controller包,编写controller

(2)实现controller接口,重写public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 方法

(3)方法返回的是ModelAndView对象,在方法里调用service方法,执行数据库操作,这里模拟静态数据

(4)modelAndView.addObject("itemsList", itemsList);  //request的setAttribut,在jsp页面中通过itemsList取数据,在jsp页面根据itemsList获取数据
        modelAndView.setViewName("itemsList.jsp"); //设置view页面

package xidian.lili.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import xidian.lili.po.Items;

public class ItemsController1 implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//里面实现servcie方法,相当于在action里调用service
		
		ArrayList<Items> itemsList=new ArrayList<Items>();
		Items items_1 = new Items();
		items_1.setName("联想笔记本");
		items_1.setPrice(6000f);
		items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
		
		Items items_2 = new Items();
		items_2.setName("苹果手机");
		items_2.setPrice(5000f);
		items_2.setDetail("iphone6苹果手机!");
		
		itemsList.add(items_1);
		itemsList.add(items_2);
		//返回modelandview
		ModelAndView modelAndView=new ModelAndView();
		//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
		modelAndView.addObject("itemsList", itemsList);
		modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

		return modelAndView;
	}

}

配置处理器映射器

映射器的作用是根据url来找到调用哪个Handler,根据这个映射器的名字,我们可以知道url就是Handler对象的 name 属性,那么顺便配置Handler 

配置Handler  

(1)Handler对象的class属性就是编写的controller类,name属性我们可以自己定义,但是最后要以.action结尾,因为我们在web.xml文件中配置前端控制器的时候,servlet-mapping中url-pattern中的配置,前端控制器只能解析.action结尾的url。这才会把url给处理器适配器。

(2)这样当用户请求的url是以/queryItem.action结尾,映射器扫描配置文件中的所有bean的name属性,找到对象的name属性,也就找到了要执行的Handler

配置视图解析器

配置视图解析器,发现默认使用jstl视图标签,所以要有jstl的jar包

显示结果
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章