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

一、前言

已经讲解异常处理机制,本身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

springMVC教程中级(六)resultful与拦截器_第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>
 */
@Controller
public class LoginController {
	
	
	//用户登陆提交方法
	@RequestMapping("/login")
	public String login(HttpSession session, String usercode,String password)throws Exception{
		
		//调用service校验用户账号和密码的正确性
		//..
		
		//如果service校验通过,将用户身份记录到session
		session.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	传智.燕青
 * @date	2015-3-22下午4:43:26
 * @version 1.0
 */
@Controller
public class LoginController {
	
	
	//用户登陆提交方法
	@RequestMapping("/login")
	public String login(HttpSession session, String usercode,String password)throws Exception{
		
		//调用service校验用户账号和密码的正确性
		//..
		
		//如果service校验通过,将用户身份记录到session
		session.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

你可能感兴趣的:(springMVC教程中级(六)resultful与拦截器)