JavaEE开发中,为了安全,是不能直接访问JSP的,往往是通过一个Controller来访问一个JSP,但如果JSP多的话就要写很多个Controller,而它所实现的仅仅是页面跳转功能。所以如果访问的URL地址不涉及Service和Dao的话,只需要单纯的页面跳转的话,此时就可以通过SimpleUrlHandlerMapping实现页面的跳转功能,这时Controller就只充当一个将URL映射到内部JSP视图的转发器。
重点内容
但是要实现这一功能,必须要有一个限制,那就是将URL格式定死了,这样才能实现用一个Controller转发至多个不同的JSP的功能。
web.xml的内容:
<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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!--
SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller
配置Properties属性值
使用props和prop子节点来为Properties属性赋值
-->
<bean id= "urlMapping" class= "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<!-- prop标签中的key都是url值,后面的为BeanID,如果我们在地址栏中输入的url
与key匹配,则分发到prop标签中指定的beanID所指定的Controller
-->
<props>
<prop key="/views/*.action">jspPageController</prop>
</props>
</property>
<property name="interceptors">
<list>
</list>
</property>
<property name= "order" value= "0" />
</bean>
<!--id相当于定义了你的这个bean的别名,如果你需要他的话只要关联这个别名就可以了-->
<bean id="jspPageController" class="cn.michael.controller.JspPageController"/>
<!--
配置处理器映射器和处理器适配器
使用<mvc:annotation-drvier/>配置注解映射器和注解适配器
-->
<mvc:annotation-driven/>
<!--
配置处理器
使用<context:component-sacn/>组件扫描器自动扫描包中标记为@Controller的注解类,
注意:多个包中间使用半角逗号分隔
要求:base-package对应的包中应该是controller包
-->
<context:component-scan base-package="cn.michael.controller"/>
<!--
配置视图解析器
要求:
1、配置解析JSP的视图解析器,默认使用JSTL,因此classpath下需要有JSTL的包
2、根据前缀和后缀,在WEB-INF目录下要有pages目录,其中存放jsp文件
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
其中,如果访问的URL匹配“/views/*.action”(这里就对格式进行了限制),那么就将其支配到BeanID对应的Controller去处理,这里是JspPageController.
<property name="mappings">
<!-- prop标签中的key都是url值,后面的为BeanID,如果我们在地址栏中输入的url
与key匹配,则分发到prop标签中指定的beanID所指定的Controller
-->
<props>
<prop key="/views/*.action">jspPageController</prop>
</props>
</property>
在src目录下的cn.michael.controller包建一个名为JspPageController 的Controller,其内容为:
package cn.michael.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JspPageController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
String jspfile = request.getRequestURI()
.substring(request.getContextPath().length())
.substring("views/".length())
.replace(".action","");
System.out.println ("JspPageController中的逻辑视图名"+jspfile);
modelAndView.setViewName(jspfile);
return modelAndView;
}
}
经过一系列方法链,从访问的URL剥离出对应的逻辑视图名jspfile,然后这个jspfile再经过视图解析器的解析就能够去访问内部的JSP等视图文件。
为了能够直接映射,这里我们直接用JSP的名字作为逻辑视图名。
在WEB-INF/pages/目录下建立一个testJspPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试SimpleURLMapping</title>
</head>
<body>
<p>
Test JspPage
</p>
</body>
</html>
然后浏览器中输入:http://localhost/SpringMVCDemo/views/testJspPage.action就能够访问到testJspPage.jsp.
项目地址:下载地址
本文介绍如何在Spring MVC框架中利用SimpleUrlHandlerMapping实现URL到JSP页面的直接映射,简化Controller的编写工作,适用于仅需进行页面跳转的场景。
740





