- 浏览: 641323 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
hsluoyz:
现在新推出了一个权限框架,叫jCasbin(https://g ...
Shiro 权限框架使用总结 -
飕飕飞:
比如说 我用私匙加密一段数据,并加密成功。那签名时用什么生成的 ...
Java使用RSA加密解密签名及校验 -
文艺吧网:
楼主讲的好详细,这里有整套 Shiro demo http:/ ...
Shiro 权限框架使用总结 -
nanshanmu:
333引用[url][*]||||[/flash][/flas ...
SpringMVC中返回值处理 -
变脸小伙:
) 业务类在Spring配置 ...
整合Struts2与Spring以及spring的自动装配
原文链接:http://my.oschina.net/u/1165099/blog/184377
Spring mvc作为一个web mvc框架的后起之秀,其易用性,拓展性则实让人在使用之余,赞叹不已。本文从Spring mvc的Controller的执行过程中,找出一些开发者用到的几个拓展点。
首先,按先后顺序列一下Spring mvc中controller的执行过程:
1. 执行所有的拦截器(实现HandlerInterceptor接口的类);
2. 调用controller方法之前,对方法参数进行解释绑定(实现WebArgumentResolver接口,spring3.1以后推荐使用HandlerMethodArgumentResolver);
3. 调用controller方法,返回逻辑视图(通常是一个视图的名称);
4. 将逻辑视图映射到物理视图(使用实现ViewResolver接口的类处理);
5. 物理视图渲染输出到客户端(实现View接口);
6. 若在以上执行过程中抛出了异常,可以自定义异常处理器对不同的异常进行处理(实现HandlerExceptionResolver接口)。
开发者通过实现以上的接口(一般情况下不需要从接口实现,通过继承Spring mvc实现的一些抽象类更简单),就可以自定义controller执行过程中的一些行为,从而让程序更富灵活性。
以下是几个常用的例子:
1. 自定义拦截器,拦截未登录用户的请求。
AuthorityInterceptor.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
public class AuthorityInterceptor extends HandlerInterceptorAdapter{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
Integer userId = (Integer)request.getSession().getAttribute("userId");
//登录才可以继续访问
if (userId != null)
{
return true;
}
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/index.html");
return false;
}
}
applicationContext-mvc.xml添加配置:
?
1
2
3
4
5
6
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<ref bean="authorityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
值得一提的是:HandlerInterceptor接口有三个方法,preHandle在controller方法调用前拦截,postHandle在controller方法调用后拦截,afterCompletion在客户端请求处理结束后(controller方法调用后,返回视图,并且视图已经渲染输出后)拦截。
2. 自定义controller方法参数的解释器,从session从取值绑定到方法参数。(实际上@SessionAttributes 已经提供该功能,此次仅为举例)
SessionValue.java
?
1
2
3
4
5
6
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionValue {
String value() default "";
}
SessionValueResolver.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Component
public class SessionValueResolver implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter parameter,
NativeWebRequest webRequest) throws Exception {
SessionValue svAnnotation = parameter.getParameterAnnotation(SessionValue.class);
if(svAnnotation == null)
{
return WebArgumentResolver.UNRESOLVED;
}
return _resolveArgument(parameter, webRequest);
}
private Object _resolveArgument(MethodParameter parameter,
NativeWebRequest webRequest) throws Exception {
SessionValue sessionValueAnnot = parameter.getParameterAnnotation(SessionValue.class);
String attrName = sessionValueAnnot.value();
if(attrName == null || attrName.equals(""))
{
attrName = parameter.getParameterName();
}
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
Object value = request.getSession().getAttribute(attrName);
if(value == null)
{
throw new Exception("SessionValueResolver: session 内没有该属性:" + attrName);
}
return value;
}
}
applicationContext-mvc.xml添加配置:
?
1
2
3
4
5
6
7
8
9
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="customArgumentResolvers">
<list>
<ref bean="sessionValueResolver"/>
</list>
</property>
<property name="order" value="1"></property>
</bean>
在controller中使用:
?
1
2
3
4
5
6
@RequestMapping("/get")
public String getUser(@SessionValue("userId")Integer userId)
{
//do something
return "user";
}
3. 自定义文件视图解释器,在controller方法里返回文件路径,实现文件下载
FileViewResolver.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FileViewResolver extends AbstractCachingViewResolver implements Ordered{
private int order = Integer.MAX_VALUE;
@Override
protected View loadView(String viewName, Locale locale) throws Exception {
if(viewName.startsWith(FileView.FILE_VIEW_PREFIX))
{
return new FileView(viewName);
}
return null;
}
@Override
public int getOrder()
{
return this.order;
}
public void setOrder(int order) {
this.order = order;
}
}
FileView.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class FileView extends AbstractView {
public static final String FILE_VIEW_PREFIX = "file:";
private String viewName;
public FileView(String viewName)
{
this.viewName = viewName;
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
File file = getOutputFile();
downloadFile(request, response, file);
}
private File getOutputFile() throws Exception
{
Integer beginIndex = viewName.indexOf(FILE_VIEW_PREFIX) + FILE_VIEW_PREFIX.length();
String filePath = viewName.substring(beginIndex).trim();
File file = new File(filePath);
if(file.exists())
{
return file;
}
throw new Exception("下载的文件不存在: " + filePath);
}
private void downloadFile(HttpServletRequest request,
HttpServletResponse response, File file)
{
//将文件写入输出流
}
}
applicationContext-mvc.xml添加配置:
?
1
2
3
<bean class="com.plugin.FileViewResolver">
<property name="order" value="1" />
</bean>
在controller中使用:
?
1
2
3
4
5
6
@RequestMapping("/download")
public String download()
{
String filePath = "f://download/text.txt";
return "file:" + filePath;
}
4. 自定义异常处理,抛出以下异常时,返回错误页面
CustomExceptionResolver.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Component
public class CustomExceptionResolver implements HandlerExceptionResolver
{
private static List<String> exceptionList;
static{
exceptionList = new ArrayList<String>();
exceptionList.add("InvalidExcelException");
exceptionList.add("NoSuchCourseExcption");
exceptionList.add("NoTraineeExcption");
exceptionList.add("NoQuestionExcption");
}
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
if(exceptionList.contains(ex.getClass().getSimpleName()))
{
return new ModelAndView("error");
}
return null;
}
}
自定义异常处理器只需要成为spring容器的bean,无需其它配置。
Spring mvc使用拓展点介绍结束。
Spring mvc使用拓展点介绍结束。
Spring mvc作为一个web mvc框架的后起之秀,其易用性,拓展性则实让人在使用之余,赞叹不已。本文从Spring mvc的Controller的执行过程中,找出一些开发者用到的几个拓展点。
首先,按先后顺序列一下Spring mvc中controller的执行过程:
1. 执行所有的拦截器(实现HandlerInterceptor接口的类);
2. 调用controller方法之前,对方法参数进行解释绑定(实现WebArgumentResolver接口,spring3.1以后推荐使用HandlerMethodArgumentResolver);
3. 调用controller方法,返回逻辑视图(通常是一个视图的名称);
4. 将逻辑视图映射到物理视图(使用实现ViewResolver接口的类处理);
5. 物理视图渲染输出到客户端(实现View接口);
6. 若在以上执行过程中抛出了异常,可以自定义异常处理器对不同的异常进行处理(实现HandlerExceptionResolver接口)。
开发者通过实现以上的接口(一般情况下不需要从接口实现,通过继承Spring mvc实现的一些抽象类更简单),就可以自定义controller执行过程中的一些行为,从而让程序更富灵活性。
以下是几个常用的例子:
1. 自定义拦截器,拦截未登录用户的请求。
AuthorityInterceptor.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
public class AuthorityInterceptor extends HandlerInterceptorAdapter{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
Integer userId = (Integer)request.getSession().getAttribute("userId");
//登录才可以继续访问
if (userId != null)
{
return true;
}
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/index.html");
return false;
}
}
applicationContext-mvc.xml添加配置:
?
1
2
3
4
5
6
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<ref bean="authorityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
值得一提的是:HandlerInterceptor接口有三个方法,preHandle在controller方法调用前拦截,postHandle在controller方法调用后拦截,afterCompletion在客户端请求处理结束后(controller方法调用后,返回视图,并且视图已经渲染输出后)拦截。
2. 自定义controller方法参数的解释器,从session从取值绑定到方法参数。(实际上@SessionAttributes 已经提供该功能,此次仅为举例)
SessionValue.java
?
1
2
3
4
5
6
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionValue {
String value() default "";
}
SessionValueResolver.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Component
public class SessionValueResolver implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter parameter,
NativeWebRequest webRequest) throws Exception {
SessionValue svAnnotation = parameter.getParameterAnnotation(SessionValue.class);
if(svAnnotation == null)
{
return WebArgumentResolver.UNRESOLVED;
}
return _resolveArgument(parameter, webRequest);
}
private Object _resolveArgument(MethodParameter parameter,
NativeWebRequest webRequest) throws Exception {
SessionValue sessionValueAnnot = parameter.getParameterAnnotation(SessionValue.class);
String attrName = sessionValueAnnot.value();
if(attrName == null || attrName.equals(""))
{
attrName = parameter.getParameterName();
}
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
Object value = request.getSession().getAttribute(attrName);
if(value == null)
{
throw new Exception("SessionValueResolver: session 内没有该属性:" + attrName);
}
return value;
}
}
applicationContext-mvc.xml添加配置:
?
1
2
3
4
5
6
7
8
9
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="customArgumentResolvers">
<list>
<ref bean="sessionValueResolver"/>
</list>
</property>
<property name="order" value="1"></property>
</bean>
在controller中使用:
?
1
2
3
4
5
6
@RequestMapping("/get")
public String getUser(@SessionValue("userId")Integer userId)
{
//do something
return "user";
}
3. 自定义文件视图解释器,在controller方法里返回文件路径,实现文件下载
FileViewResolver.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FileViewResolver extends AbstractCachingViewResolver implements Ordered{
private int order = Integer.MAX_VALUE;
@Override
protected View loadView(String viewName, Locale locale) throws Exception {
if(viewName.startsWith(FileView.FILE_VIEW_PREFIX))
{
return new FileView(viewName);
}
return null;
}
@Override
public int getOrder()
{
return this.order;
}
public void setOrder(int order) {
this.order = order;
}
}
FileView.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class FileView extends AbstractView {
public static final String FILE_VIEW_PREFIX = "file:";
private String viewName;
public FileView(String viewName)
{
this.viewName = viewName;
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
File file = getOutputFile();
downloadFile(request, response, file);
}
private File getOutputFile() throws Exception
{
Integer beginIndex = viewName.indexOf(FILE_VIEW_PREFIX) + FILE_VIEW_PREFIX.length();
String filePath = viewName.substring(beginIndex).trim();
File file = new File(filePath);
if(file.exists())
{
return file;
}
throw new Exception("下载的文件不存在: " + filePath);
}
private void downloadFile(HttpServletRequest request,
HttpServletResponse response, File file)
{
//将文件写入输出流
}
}
applicationContext-mvc.xml添加配置:
?
1
2
3
<bean class="com.plugin.FileViewResolver">
<property name="order" value="1" />
</bean>
在controller中使用:
?
1
2
3
4
5
6
@RequestMapping("/download")
public String download()
{
String filePath = "f://download/text.txt";
return "file:" + filePath;
}
4. 自定义异常处理,抛出以下异常时,返回错误页面
CustomExceptionResolver.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Component
public class CustomExceptionResolver implements HandlerExceptionResolver
{
private static List<String> exceptionList;
static{
exceptionList = new ArrayList<String>();
exceptionList.add("InvalidExcelException");
exceptionList.add("NoSuchCourseExcption");
exceptionList.add("NoTraineeExcption");
exceptionList.add("NoQuestionExcption");
}
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
if(exceptionList.contains(ex.getClass().getSimpleName()))
{
return new ModelAndView("error");
}
return null;
}
}
自定义异常处理器只需要成为spring容器的bean,无需其它配置。
Spring mvc使用拓展点介绍结束。
Spring mvc使用拓展点介绍结束。
发表评论
-
context:component-scan扫描使用上的容易忽略的use-default-filters
2015-11-13 21:28 875问题 如下方式可以成功扫描到@Controller注解的Bea ... -
MongoDB Java Driver操作指南
2015-08-04 21:42 2604MongoDB为Java提供了非常丰富的API操作,相比关系 ... -
Spring3自定义环境配置 <beans profile="">
2015-04-22 10:51 1311摘自springside3 Spring 3.1的功能 ... -
json-rpc 1.0规范解读
2015-04-17 14:21 1353JSON可能是这个地球上 ... -
request.getParameter()、request.getInputStream()和request.getReader()
2015-03-30 11:16 3037大家经常 用servlet和jsp, ... -
微信企业号上传下载多媒体文件接口详解演示-java
2015-03-27 15:37 6387企业在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作 ... -
java如何得到GET和POST请求URL和参数列表
2015-03-13 16:28 3162在servlet中GET请求可以通过HttpServletR ... -
关于<context:property-placeholder>的一个有趣现象
2015-01-05 20:09 627先来看下A和B两个模块 A模块和B模块都分别拥有自己的S ... -
spring jms _ activemq
2015-01-05 13:50 951参考链接: http://bsnyderblog.blogsp ... -
读取配置信息
2014-12-29 18:08 896第一种方法是使用java.io和java.util包,缺点是路 ... -
spring 事件机制
2014-11-14 14:17 1004在Spring中已经定义的五 ... -
spring InitializingBean接口
2014-10-27 01:33 667最近工作需要得到sping中的每个事物需要执行的sql, ... -
spring InitializingBean接口
2014-10-27 01:33 995最近工作需要得到sping中的每个事物需要执行的sql,称 ... -
四种常见的 POST 提交数据方式
2014-09-23 11:38 1669HTTP/1.1 协议规定的 HTTP 请求方法有 OPT ... -
使用 Java 配置进行 Spring bean 管理
2014-07-31 17:58 881Spring bean 是使用传统的 XML 方法配置的。在 ... -
怎么使用Servlet 3.0中的上传文件呢?
2014-07-31 15:20 971Spring 3.1开始提供了Servlet 3.0的支持。 ... -
Spring MVC handler method 参数绑定常用的注解
2014-07-31 10:36 2039参考链接:http://csjava.bl ... -
SpringMVC中使用Interceptor拦截器
2014-06-30 15:18 883SpringMVC 中的Interceptor 拦 ... -
AOP的底层实现-CGLIB动态代理和JDK动态代理
2014-05-04 16:58 1073AOP是目前Spring框架中的 ... -
Spring AOP 实现原理与 CGLIB 应用
2014-05-04 16:39 759AOP(Aspect Orient Programmi ...
相关推荐
本节主要探讨如何使用Spring MVC的Resource接口来实现文件下载功能,特别是针对Word、Excel和PDF这三种常用文件格式。 首先,我们需要创建一个Maven Web项目,并添加必要的依赖,包括Spring MVC相关的库,确保项目...
84.企业人力资源管理系统的设计与实现|基于 Spring MVC模式+B/S架构+ Oracle数据库+MVC框架 设计与实现(非开源可运行源码+数据库+lw)毕业设计管理系统计算机软件工程大数据专业 可运行源码(含数据库脚本)+开发...
《Spring MVC之@RequestMapping详解》 在Java Web开发中,Spring MVC框架因其强大的功能和灵活性而备受青睐。在处理HTTP请求时,@RequestMapping注解扮演着至关重要的角色,它负责将客户端的请求映射到控制器中的...
SSM后台管理系统框架是基于Java技术栈开发的Web应用程序,主要由Spring MVC、MyBatis和MySQL数据库,以及EasyUI前端框架构建而成。这个框架在企业级应用开发中非常常见,因为它提供了强大的功能和高效的开发效率。...
是一个通用JavaWeb项目框架,使用Java、Web等一系列技术,搭建开发高性能、高可拓展性、高可维护性,高安全性的web项目;...前端使用MetroNic模板,后端架构:Spring + Spring MVC + Mybatis + Apache Shiro。
5. **MVC 拓展和辅助库** - `spring-expression.jar`:提供了强大的表达式语言(SpEL),用于在运行时查询和操作对象属性。 - `aopalliance.jar`:AOP 联盟库,提供 AOP 通用接口。 - `asm.jar` 和 `cglib-nodep....
本教程将通过一个名为"spring-mvc-demo"的项目,详细介绍如何使用Spring框架来实现RESTful Web服务。 一、Spring MVC与RESTful Web服务 Spring MVC是Spring框架的一部分,专门用于处理Web请求和响应。RESTful Web...
在默认情况下,Spring MVC使用`WebDataBinder`来处理数据绑定,它可以将请求参数与Java对象的字段进行匹配,并通过类型转换器(`Converter`)和格式化器(`Formatter`)将字符串值转化为对象类型。如果遇到无法直接...
这些书籍可能涵盖了Spring的核心概念,如IoC容器、AOP原理、数据访问集成、MVC架构以及Spring Boot和Spring Cloud等现代拓展。通过这些书籍,你可以了解到: 1. **Spring IoC容器**:Spring的核心功能之一是管理...
除了 Spring MVC,Spring 还可以与其他 Web 框架结合使用,这一章节会介绍如何在 Spring 的基础上集成其他流行的 Web 框架。 #### 10. Data Access 数据访问是应用程序的基础,Spring 提供了多种方式来处理数据库...
设计实现一个简易的类“微博”的单体式 Web 应用,其中需要实现的功能包括基础功能和拓展功能。 基础功能包括: 用户账号服务:用户注册、用户登录、用户退出 微博查看:微博列表,支持按发布时间、评论数、点赞...
在进行企业级应用开发时,Spring的这些特性可以与Java EE规范中的其他技术无缝整合,如JPA、JMS、JTA等,进一步拓展了Spring的使用场景和能力。在不断的发展中,Spring全家桶还包含了Spring Boot、Spring Cloud等更...
书中不仅介绍了Spring框架的基本概念和原理,更深入到Spring框架内部,对各种设计模式、核心组件以及整体架构进行解析,旨在帮助开发者提升开发技能和拓展开发能力,尤其是在Java开发领域。 Spring框架是当前Java...
2. 强化模块化:Spring Framework 5.0系列更加注重模块化设计,方便开发者根据实际需求选择和组合使用不同的模块,如Spring MVC、Spring WebFlux等。 3. 支持Java 9和10:此版本适配了Java最新的版本,确保在新JVM...
根据给定的文件信息,我们将深入探讨Spring框架2.5版本中的关键知识点。Spring框架是一个开源的Java平台,用于构建企业级应用,特别是...对于Java开发者而言,熟练掌握Spring框架是提升技能、拓展职业道路的关键之一。
Spring的拓展技术包括Spring Boot和Spring Cloud。Spring Boot是一个快速配置脚手架,能基于Spring Boot快速开发单个微服务,它基于“约定优于配置”的理念,简化了配置工作。Spring Cloud则是基于Spring Boot实现的...
4. **Spring Security与Spring MVC**:Spring Security可以与Spring MVC无缝集成,为Web应用提供安全控制。 总之,Spring Security是Spring生态中的重要组件,它提供了强大的安全框架,能够满足各种复杂的安全需求...
在 Spring MVC 框架中,Controller 中的方法参数可以使用注解来标识,这些注解可以让开发者更方便地处理请求参数。今天,我们将深入探讨 Spring MVC 中 Controller 方法参数的注解方式。 首先,让我们看一下 Spring...
Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP。 SpringMVC是Spring实现的一个Web层,相当于Struts的框架,但是比Struts更加灵活和强大! Mybatis是 一个持久层的框架,在...
下面我们将深入探讨 Spring MVC 的核心概念、工作原理以及如何在实际项目中进行拓展。 ### 一、核心概念 1. **DispatcherServlet**:Spring MVC 的入口点,负责接收请求,并根据配置分发到相应的处理器。 2. **...