springMVC教程中级(六)resultful与拦截器

来源:互联网 发布:测试网络丢包率软件 编辑:程序博客网 时间:2024/05/23 12:26

一、前言

已经讲解异常处理机制,本身springmvc已经讲解完毕,后面两个内容为了解。拦截器在我们项目总还是很常用了,我用一个登录简单方法作为例子讲解。

二、result配置

我们经常看到各种resultful,其实就是一种规范。我简单贴出一个springmvc符合规范的例子;所谓规范就是四钟方法:get post put delete,而我们常用为前两种。没有参数,每一个url代表一个资源;

2.1首先修改web.xml里面dispatch

按照规范是用斜线代替的

    <servlet-mapping>        <servlet-name>springMVC</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>

2.2 修改我们额controller方法

    @RequestMapping("/viewItems/{id}")    @ResponseBody    public ItemsCustom viewItemsCustom(@PathVariable("id") Integer id)throws Exception{        ItemsCustom itemsCustom = itemsService.getItemsById(id);        return itemsCustom;    }


调用的时候测试:http://localhost:8080/spring01/items/viewItems/1


2.3 用来resultful之后解决无法访问静态资源问题

我们以js为例子::
1、在springmvc.xml里面配置静态资源
   <!--========================================静态资源=======================================================-->    <mvc:resources mapping="/js/**" location="pages/jsp/js/"></mvc:resources>

2、或者在web.xml里面加
    <servlet-mapping>        <servlet-name>default</servlet-name>        <url-pattern>*.js</url-pattern>    </servlet-mapping>

三、拦截器

用户请求到DispatherServlet中,DispatherServlet调用HandlerMapping查找HandlerHandlerMapping返回一个拦截的链儿(多个拦截),springmvc中的拦截器是通过HandlerMapping发起的。在企业开发,使用拦截器实现用户认证(用户登陆后进行身份校验拦截),用户权限拦截。


3.1实现拦截器

在springmvc.xml里面配置

3.1.1 bean传统方式(方式一)

    <!--========================================拦截器态资源==============================================-->    <bean            class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">        <property name="interceptors">            <list>                <ref bean="handlerInterceptor01"/>                <ref bean="handlerInterceptor02"/>            </list>        </property>    </bean>    <bean id="handlerInterceptor01" class="com.ycy.interceptor.HandlerInterceptor01"/>    <bean id="handlerInterceptor02" class="com.ycy.interceptor.HandlerInterceptor02"/>

3.1.2 springmvc标签(方式二)

    <mvc:interceptors>        <!--多个拦截器,顺序执行 -->        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean class="com.ycy.interceptor.HandlerInterceptor01"></bean>        </mvc:interceptor>        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean class="com.ycy.interceptor.HandlerInterceptor02"></bean>        </mvc:interceptor>    </mvc:interceptors>

拦截器类:
package com.ycy.interceptor;/** * Created by Administrator on 2015/10/10 0010. */import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 拦截器01 */public class HandlerInterceptor01 implements HandlerInterceptor{    //执行handler之前:    // 用户校验等等    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        return false;    }    //执行handler,返回modelAndView之前:    //页面公共属性,视图信息    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {    }    //执行handler后:    //统一异常,性能监控等,统一日志    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {    }}

3.2拦截器顺序特性

1】执行preHandle是顺序执行。执行postHandle、afterCompletion是倒序执行

2】只要有一个拦截器不放行,controller不能执行完成

3】只有前边的拦截器preHandle方法放行,下边的拦截器的preHandle才执行

3.3配置拦截器(登录)

1、配置登录、退出jcontroller

package com.ycy.controller;import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/** *  * <p>Title: LoginController</p> * <p>Description: 登陆和退出</p> */@Controllerpublic class LoginController {//用户登陆提交方法@RequestMapping("/login")public String login(HttpSession session, String usercode,String password)throws Exception{//调用service校验用户账号和密码的正确性//..//如果service校验通过,将用户身份记录到sessionsession.setAttribute("username", usercode);//重定向到商品查询页面return "redirect:/items/queryItems";}//用户退出@RequestMapping("/logout")public String logout(HttpSession session)throws Exception{//session失效session.invalidate();//重定向到商品查询页面return "redirect:/items/queryItems";}}

2、编写登录页面login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!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>用户登陆</title></head><body><form action="${pageContext.request.contextPath }/login.action">用户账号:<input type="text" name="usercode" /><br/>用户密码 :<input type="password" name="password" /><br/><input type="submit" value="登陆"/></form></body></html>

3、编写退出页面itemsList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"  %><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %><!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>查询商品列表</title><script type="text/javascript">//--------------------------------------批量删除商品----------------------------------------------function deleteItems(){document.itemsForm.action="${pageContext.request.contextPath }/items/deleteItems";document.itemsForm.submit();}</script></head><body>当前用户:${username }<c:if test="${username!=null }"><a href="${pageContext.request.contextPath }/logout">退出</a></c:if><form name="itemsForm" action="${pageContext.request.contextPath }/items/queryItem" method="post">查询条件:<table width="100%" border=1><tr><td><input type="submit" value="查询"/><input type="button" value="批量删除"  onclick="deleteItems()"/><select><c:forEach items="${itemtype}" var="item"><option value="${item.key}">${item.value}</option></c:forEach></select></td></tr></table>商品列表:33<table width="100%" border=1><tr><td>商品名称</td><td>商品价格</td><td>生产日期</td><td>商品描述</td><td>操作</td></tr><c:forEach items="${itemsList}" var="item"><tr><td><input type="checkbox" name="delete_id" value="${item.id}"/></td><td>${item.name}</td><td>${item.price}</td><td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td><td>${item.detail}</td><td><a href="${pageContext.request.contextPath }/items/editItems?id=${item.id}">修改</a></td><td><a href="${pageContext.request.contextPath }/items/viewItems/${item.id}">查询商品信息</a></td></tr></c:forEach></table></form></body></html>

4、编写拦截器LoginInterceptor

package com.ycy.controller;import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/** *  * <p>Title: LoginController</p> * <p>Description: 登陆和退出</p> * <p>Company: www.itcast.com</p>  * @author传智.燕青 * @date2015-3-22下午4:43:26 * @version 1.0 */@Controllerpublic class LoginController {//用户登陆提交方法@RequestMapping("/login")public String login(HttpSession session, String usercode,String password)throws Exception{//调用service校验用户账号和密码的正确性//..//如果service校验通过,将用户身份记录到sessionsession.setAttribute("username", usercode);//重定向到商品查询页面return "redirect:/items/queryItems";}//用户退出@RequestMapping("/logout")public String logout(HttpSession session)throws Exception{//session失效session.invalidate();//重定向到商品查询页面return "redirect:/items/queryItems";}}

5、将拦截器加入springmvc

    <!--拦截器 -->    <mvc:interceptors>        <!--多个拦截器,顺序执行 -->        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean class="com.ycy.interceptor.HandlerInterceptor01"></bean>        </mvc:interceptor>        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean class="com.ycy.interceptor.HandlerInterceptor02"></bean>        </mvc:interceptor>        <mvc:interceptor>            <mvc:mapping path="/**"/>            <bean class="com.ycy.interceptor.LoginInterceptor"></bean>        </mvc:interceptor>    </mvc:interceptors>


总之拦截器就是在围绕你执行handler之前之后等到,我以最常见登录讲解希望明白。一般小公司或者大公司小项目的登录真的就是这样可以完全解决。到此springmvc讲解完毕。国庆归来感觉疲惫,接下来讲解shrio,让我们看看什么是真正权限拦截器框架。项目已经上传git  项目名称:spring01

1 0