>另一种处理器映射器: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来说,可以让多个处理器映射器共存,由前端控制器判断用户请求的url能让哪些映射器来处理,就让哪个正确的的映射器处理。
>另一种处理器适配器:HttpRequestHandlerAdapter
补充:基本数据类型int 默认值为0; 引用数据类型默认值为null;
在上面的入门程序中,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter就是一个非注解的适配器。此适配器要求所有的Handler处理器必须实现Controller接口。使用方式参考入门程序。
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter是SpringMVC提供的另外一种非注解的处理器适配器,配置如下图所示(同时配置多种适配器是可以的,因为程序可能有多种handler):
查看该类的原码如下:
此适配器要求Handler处理器必须实现HttpRequestHandler接口,测试类如下所示:
通过上面测试类的编写,大家会发现这种编程非常类似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}
运行结果:
另外的,将xml配置中的处理器,适配器的配置删掉,程序仍可以运行:
bookListAction
userListAction