Spring MVC中用SimpleUrlHandlerMapping实现单纯的页面跳转

本文介绍如何在Spring MVC框架中利用SimpleUrlHandlerMapping实现URL到JSP页面的直接映射,简化Controller的编写工作,适用于仅需进行页面跳转的场景。

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.
项目地址:下载地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值