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

 2023-09-17 阅读 15 评论 0

摘要:>另一种处理器映射器:SimpleUrlHandlerMapping 之前的beanNameHandlerMapping,是根据handler的bean标签的name属性,作为访问的url; SpringMVC还提供了另外一个非注解的处理器映射器SimpleUrlHandlerMapping,这个映射器可以实现对bean 的

>另一种处理器映射器: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

jvmjrejdk三者之间什么关系?补充:基本数据类型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配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--     <context:component-scan base-package="com.langsin.action"></context:component-scan><mvc:annotation-driven/>  --> <!-- 配置SpringMVC的handler.SimpleUrlHandlerMapping处理器映射器,这个bean给Spring用,不用配置Id --><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/book_list.action">bookListAction</prop></props></property></bean>	<!-- 配置处理器映射器BeanNameUrlHandlerMappin,这个bean给Spring用,不用配置Id --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--配置处理器适配器:SimpleControllerHandlerAdapter,根据映射返回的执行链中的Handler,由适配器来执行Handler  --><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean><!--配置处理器适配器:HttpRequestHandlerAdapter,根据映射器返回的执行链中的Handler,由适配器来执行Handler(实现接口不同)  --><bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> <!-- 配置Handler  以及对应的映射 name就是url class是对应的执行bean --><!-- 也可以使用下面第二种方式,配置id,使用 SimpleUrlHandlerMapping的property属性进行配置--><bean name="/user_list.action" class="com.langsin.action.TestAction"/><bean id="bookListAction" class="com.langsin.action.BookListAction"/></beans>

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 {@Overridepublic void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 这里如果去数据库查,需要整合MyBatis,先伪造一点数据List<Book> 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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<tr><th>书籍编号</th><th>书名</th><th>作者</th></tr>
<c:forEach items="${booklist}" var="book" >
<tr><td>${book.bookId}</td><td>${book.bookName}</td><td>${book.price}</td></tr>
</c:forEach>
</table>
</body>
</html>

运行结果:

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd">    <!-- 配置这里是为了保留映射关系--><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/book_list.action">bookListAction</prop><prop key="/user_list.action">userListAction</prop></props></property></bean>	<bean name="/user_list.action" id="userListAction" class="com.langsin.action.TestAction"/><bean id="bookListAction" class="com.langsin.action.BookListAction"/></beans>

 

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/72563.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息