spring mvc工作原理解析

springMVC各个组件间工作路线图:

springmvc实现controller的三种方式:

①实现controller接口

②实现HttpRequestHandler接口

③使用@Controller注解

各个组件解析:

1.前端控制器(DispacterServlet):由spring提供,不需要程序员编写,配置在web.xml文件中,主要用于接受前台的请求、请求查找controller以及向前台作出响应,它是前台请求进入后台和后台响应前台的唯一通道。在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.xml</param-value>
	  </init-param>
</servlet>
  <servlet-mapping>
  	<servlet-name>springMvc</servlet-name>
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>

2.处理器映射器(HandelMapping):它是配置在springMVC-Servlet.xml中的,主要用于接受前端控制器的请求,并通过前端控制器发来的URL进行controller的适配,它的实现有两种,一种是通过xml配置的方式(xml配置方式又分不同种映射器,其映射风格有所不同),另一种是注解的方式,例如:

①xml配置方式:

<bean id="ItemsController1" name="/query.action" class="mfx.ssm.controller.ItemsController1"/>
 <bean  id="ItemsController2" class="mfx.ssm.controller.ItemsController2"/>
 <bean id="loginController" name="/login.action" class="mfx.ssm.controller.loginController"/>
 <!--处理器映射器 1 -->
 <!--非注解的处理器映射器  -->
 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
 <!--处理器映射器 2 -->
 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="mappings">
	   <props>
	     <prop key="/query1.action">ItemsController1</prop>
	     <prop key="/query2.action">ItemsController1</prop>
	     <prop key="/query3.action">ItemsController2</prop>
	    </props>
   </property>
 
 </bean>

②注解方式

@RequestMapping("/delete")
    public String delete(Model model,HttpServletRequest request){
    	int id=Integer.parseInt(request.getParameter("id"));
    	DateFormat mediumDateFormat = DateFormat.getDateTimeInstance
	       		(DateFormat.MEDIUM,DateFormat.MEDIUM); 
		Date date=new Date();
    	GiveBooks giveBooks =new GiveBooks();
    	Books book=new Books();
    	book=bookService.selectById(id);
    	giveBooks.setName(book.getName());
    	giveBooks.setPhoneNum(book.getPhoneNum());
    	giveBooks.setMoney(book.getMoney());
    	giveBooks.setGiveTime(mediumDateFormat.format(date));
    	giveBooks.setType(book.getType());
    	bookService.insertIntoGive(giveBooks);
    	bookService.delete(id);
    	return check(model);
    }

3.处理器适配器(HandlerAdapter):配置在springMVC-Servlet.xml中,用于执行controller,处理器适配器大体分为两种,xml配置型(又可以分为多种类型)和注解型,通常不同的处理器适配器所要求的controller的实现方法是不同的,比如下边的处理器适配器要求相应的controller实现Controller接口,只有满足要求它才能正确执行,例如:

①xml配置型

<!-- 处理器适配器1 
 所有处理器适配器都实现Controller接口
 -->
 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

controller:

public class loginController implements Controller{
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String name=request.getParameter("name");
		String password=request.getParameter("password");
		AbstractApplicationContext context =new ClassPathXmlApplicationContext("application-servicel.xml");
		loginService ps1=(loginService) context.getBean("loginService");
		person pBeans=new person();
		pBeans=ps1.loginPersons(name,password);
		ModelAndView modelAndView =new ModelAndView();
		//相当于setAttribute方法,在jsp中通过itemList进行获取
		modelAndView .setViewName("/WEB-INF/jsp/welcom.jsp");
		return modelAndView;
	}
	
	
}

 

这个类型的适配器需要controller类实现Controller接口

 

②注解型:

@Controller
@RequestMapping("/books")
public class BooksController {
    
    @Resource
   BookService bookService;//没有用new创建对象,是因为是由spring容器管理的
    /*@Autowired是默认按照类型装配的 @Resource默认是按照名称装配的*/
    /*
     * 产品列表与分页Action
     */
    @RequestMapping("/insert")
    public String list(Model model,@ModelAttribute("entity") @Valid Books entity,BindingResult bindingResult) throws IOException{
    	/*1.Valid注解用于校验
    	 *2.@ModelAttribute运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用*/
    	//System.out.println("++++++"+entity.getWeight());
    	if(entity.getWeight()==null||entity.getWeight().equals("")){
    		entity.setWeight("未填");
    	}
    	System.out.println("+++========");
    	DateFormat mediumDateFormat = DateFormat.getDateTimeInstance
	       		(DateFormat.MEDIUM,DateFormat.MEDIUM); 
		Date date=new Date();
		entity.setDate(mediumDateFormat.format(date));
    	bookService.insert(entity);
    	//response .getWriter().print("<script language='javascript'>记账成功</script>");
        return check(model);//必须写成这样,不然访问不到 
    }

4.处理器(Controller):由程序员编写,用于请求的处理,处理器通常会调用Service层进行数据处理与获取。

5.视图解析器:由spring提供,配置在springMVC-Servlet.xml 中,用于视图解析,通常的作用是给URL拼接前缀和后缀,如:

<bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        id="internalResourceViewResolver">
        <!--指定视图渲染类 -->
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <!--自动添加到路径中的前缀 -->
        <property name="prefix" value="/WEB-INF/views/jstl/" />
        <!--自动添加到路径中的后缀 -->
        <property name="suffix" value=".jsp" />
        <!--设置所有视图的内容类型,如果视图本身设置内容类型视图类可以忽略 -->
        <property name="contentType" value="text/html;charset=UTF-8" />
        <!-- 优先级,越小越前 -->
        <property name="order" value="2" />
    </bean>

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪舟子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值