springMVC restful风格和拦截器

2018年03月08日 09:28 | 2518次浏览 作者原创 版权保护

一、restful简述

1,REST架构师一个抽象的概念,目前主要是基于HTTP协议实现,其目的是为了提高系统的可伸缩性,降低应用之间的耦合度,便于框架分布式处理程序。

 

2,REST主要对以下两方面进行了规范

-定位资源的URL风格,例如

 http://baidu.com/admin/1234

 http://baidu.com/admin/1234/10/11

-如何对资源操作

 采用HTTP协议规定的GET、POST、PUT、DELETE动作处理资源的增删该查操作

3,什么是RESTful?

 -符合REST约束风格和原则的应用程序或设计就是RESTful.

 eg:  /emp/1  HTTP GET      查询id=1的emp

       /emp/1  HTTP DELETE    删除id=1的emp,实验中直接删除会报405错误,但是采用$.ajax异步删除就没问题

       /emp/1  HTTP PUT    跟新emp

       /emp/add  HTTP POST     新增emp

 

4,Spring对RESTful的支持

- Spring MVC 对 RESTful应用提供了以下支持

- 利用@RequestMapping 指定要处理请求的URI模板和HTTP请求的动作类型

- 利用@PathVariable讲URI请求模板中的变量映射到处理方法参数上

- 利用Ajax,在客户端发出PUT、DELETE动作的请求

 

eg: @RequestMapping(value = "/{id}", method = RequestMethod.GET)

      public String toUpdate(@PathVariable("id") Integer id, Model model) {}

 

5,RequestMapping的一般应用格式。

 

 @RequestMapping(value = "/{id}", method = RequestMethod.GET)

 

 @RequestMapping(value = "/{id}", method = RequestMethod.POST)

 

 @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)   // 因为这个需要Ajax请求,所有返回的是个json

 @ResponseBody

 @RequestMapping(value = "/{id}", method = RequestMethod.PUT)

二、RESTful配置

我们经常看到各种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

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查找Handler,HandlerMapping返回一个拦截的链儿(多个拦截),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;

/**
 * 
 */

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>
 * 
 * @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讲解完毕.



小说《我是全球混乱的源头》
此文章本站原创,地址 https://www.vxzsk.com/614.html   转载请注明出处!谢谢!

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程