SpringMVC 另一种基于xml的处理器、适配器(了解)

>另一种处理器映射器:SimpleUrlHandlerMapping

之前的beanNameHandlerMapping,是根据handler的bean标签的name属性,作为访问的url;

SpringMVC还提供了另外一个非注解的处理器映射器SimpleUrlHandlerMapping,这个映射器可以实现对bean

的url的集中管理,首先配置一个handler Bean通过bean ID与property元素中的prop子元素关联,key属性配置的是访问的业务的url,prop元素内容为bean ID,表示当访问到/queryItem1.action业务时,SpringMVC通过映射器查询到itemListhandler,然后将它交由Handler适配器去执行。如下所示:

SpringMVC 另一种基于xml的处理器、适配器(了解)_第1张图片

注意:对于SpringMVC来说,可以让多个处理器映射器共存,由前端控制器判断用户请求的url能让哪些映射器来处理,就让哪个正确的的映射器处理。

 >另一种处理器适配器:HttpRequestHandlerAdapter

补充:基本数据类型int 默认值为0; 引用数据类型默认值为null;

在上面的入门程序中,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter就是一个非注解的适配器。此适配器要求所有的Handler处理器必须实现Controller接口。使用方式参考入门程序。

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter是SpringMVC提供的另外一种非注解的处理器适配器,配置如下图所示(同时配置多种适配器是可以的,因为程序可能有多种handler):

查看该类的原码如下:

SpringMVC 另一种基于xml的处理器、适配器(了解)_第2张图片

此适配器要求Handler处理器必须实现HttpRequestHandler接口,测试类如下所示:

SpringMVC 另一种基于xml的处理器、适配器(了解)_第3张图片

SpringMVC 另一种基于xml的处理器、适配器(了解)_第4张图片

通过上面测试类的编写,大家会发现这种编程非常类似JSP、Servlet中Servlet的代码编写。大家可能会认为这种方式不如上面实现Controller接口的handler更加直观。但是这种方式却比较灵活,因为实现Controller接口的handler返回值就是一个ModelAndView对象,如果需要服务器端响应后,返回json格式的数据,返回image对象数据,它就不能实现。而使用第二种方式,可以通过修改response对象,设置响应格式,所以在开发时可根据需要实现不同类型的handler。

总结:在SpringMVC中多个处理器映射器、适配器是可以共存的。通过用户访问的url路径映射到一个具体的handler对象后,SpringMVC来确定此handler的类型来决定此Handler应该交由哪种适配器去调用执行。

注意:如果在springmvc.xml文件即使不配置处理器映射器、处理器适配器,程序仍然可以正常执行,原因如下:在前端控制器DispatcherServlet所在的包org.springframework.web.servlet下包含一个DispatcherServlet.properites属性文件,在该文件中配置了大量的处理器映射器、处理器适配器、视图解析器等组件,如果在springmvc.xml配置文件中没有配置映射器、适配器,那么SpringMVC就使用该属性文件中默认配置的组件。

>demo

Spring-mvc配置:



 
    
        
    
	
	
	 
	  bookListAction
	 
	
		
	
     
	
	
	
	
	
	 
	
	
	
	
	
	
	

Handler:

package com.langsin.action;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

import org.springframework.web.HttpRequestHandler;

import com.langsin.pojo.Book;

public class BookListAction implements HttpRequestHandler {

	@Override
	public void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 这里如果去数据库查,需要整合MyBatis,先伪造一点数据
				List booklist=new ArrayList<>();
				ServletContext application=req.getServletContext();
				String webPath=application.getRealPath("/")+"WEB-INF/datas/book.txt";
				BufferedReader reader=new BufferedReader(new FileReader(webPath));
				String line=null;
				while((line=reader.readLine())!=null){
					String[] datas=line.split(",");
					Book book =new Book(Integer.parseInt(datas[0]),datas[1],Double.parseDouble(datas[2]));
					booklist.add(book);
				}
				reader.close();
				req.setAttribute("booklist", booklist);
                //请求转发
				req.getRequestDispatcher("/WEB-INF/jsp/book_list.jsp").forward(req, resp);
	}

}

jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>




Insert title here



书籍编号书名作者
${book.bookId}${book.bookName}${book.price}

运行结果:

SpringMVC 另一种基于xml的处理器、适配器(了解)_第5张图片

另外的,将xml配置中的处理器,适配器的配置删掉,程序仍可以运行:


    
     
    
	
	
	 
	  bookListAction
	  userListAction
	 
	
		

	
	
	

 

你可能感兴趣的:(SSM)