- 浏览: 932996 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (251)
- WebService (17)
- IBatis (22)
- Hibernate (1)
- SpringMVC - 基础篇 (32)
- Spring (15)
- Java (11)
- JVM及调优 - 基础篇 (4)
- 集群 (14)
- 数据库 (17)
- WebSphere (5)
- 多线程 (4)
- 集合、容器 (2)
- DB Pool (1)
- Power Designer (5)
- Maven基础 (5)
- JS (14)
- WEB 前端 (5)
- 实用小工具 (17)
- 社会、人 (2)
- 乱七八糟 (18)
- ASM&CGLIB - 基础篇 (12)
- 缓存 (1)
- 性能 (1)
- 设计之殇 (1)
- 分布式事务 (1)
- 单点登录 (11)
- 分布式 Session (4)
- Memcached - 基础篇 (6)
最新评论
-
一笑_奈何:
楼主写的还真行不错。
扫盲贴 - J2EE集群之JNDI集群实现 -
xuezhongyu01:
博主写的很详细,但最后还是没明白,最后调用BasicDataS ...
Spring中的destroy-method方法 -
Mr梁:
commons-fileupload.jar commons- ...
SpringMVC 中文件上传 MultipartResolver -
Eywa:
总结的很不错
ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 -
TryRelax:
fastjson 比 jackson 好用吧?
Spring MVC Jackson DateFormat
在传统的Spring MVC开发方法中,必须在Bean配置文件中为每个控制器类配置实例和请求映射和让每个控制器类去实现或者扩展特定于框架的接口或者基类,不够灵活。 如果Spring MVC可以自动侦测你的控制器类和请求映射,就能减少配置所需要的工作量。 Spring2.5支持一种基于注解的控制器开发方法。 Spring可以通过@Controller注解自动发现你的控制器类以及@RequestMapping注解中的请求映射,这样就为你免去了在Bean配置文件中配置它们的麻烦。此外,如果使用注解,控制器类和处理程序方法在访问上下文资源(例如请求参数、模型属性和会话属性)时也会更加灵活。 常用到的注解 处理程序方法的签名非常灵活。你可以为处理程序方法指定任意的名称,并定义以下任意一种类型作为它的方法参数。在这里,只提到了常见的参数类型。关于有效参数类型的完整列表,请参阅有关配置基于注解的控制器的Spring文档。 常见的参数类型 1.HttpServletRequest、HttpServletResponse或HttpSession。 2.添加了@RequestParam注解的任意类型的请求参数 3.添加了@ModelAttribute注解的任意类型的模型属性 4.任意类型的命令对象,供Spring绑定请求参数 5.Map或者ModelMap,供处理程序方法向模型添加属性 6.Errors或者BindingResult,让处理程序方法访问命令对象的绑定和验证结果 7.SessionStatus,让处理程序方法发出会话处理已经完成的通知 常见的返回值类型 处理程序方法的返回类型可以是ModelAndView、Model、Map、String、void
在创建基于注解的控制器之前,必须构建web应用程序上下文来处理注解。 首先,为了让Spring用@Controller注解自动侦测控制器,必须通过<context:component-scan>元素启用Spring的组件扫描特性。 其次Spring MVC还能够根据@RequestMapping将请求映射到控制器类和处理程序方法。 为了使其生效,必须在web应用程序上下文中注册DefaultAnnotationHandlerMapping实例和AnnotationMethodHandlerAdapter实例。 它们分别处理在类级别和方法级别上的@RequestMapping注解。 必要的Spring MVC配置 DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter是默认在Web应用程序上下文中预先注册好的。然而,如果你还显式地注册了其他的处理程序映射或者处理程序适配器,它们就不会自动注册了。在这种情况下,你必须亲自注册它们。
基于注解的控制器类可以是个任意类,不实现特殊接口,也不扩展特殊的基类。你只要用@Controller注解对它进行标注即可。还可以在控制器中定义一个或者多个处理程序方法来处理单个或者多个动作。处理程序方法的签名很灵活,足以接受一系列参数。
@RequestMapping注解可以被应用到类级别或者方法级别上。
<?xml version="1.0" encoding="UTF-8" ?>
<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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc/spring-mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 自动扫描注解的Controller -->
<context:component-scan base-package="com.wy.controller.annotation" />
<!-- 处理在类级别上的@RequestMapping注解-->
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<!-- 处理方法级别上的@RequestMapping注解-->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- 视图解析器策略 和 视图解析器 -->
<!-- 对JSTL提供良好的支持 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 默认的viewClass,可以不用配置
<property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" />
-->
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
Controller层:代码中写了很详细的注释
package com.wy.controller.annotation; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.support.WebRequestDataBinder; import org.springframework.web.servlet.ModelAndView; import com.wy.pojo.User; /** * @author Administrator * @version 2011-12-3 */ @Controller @RequestMapping("userManagerContoller") //指定请求路径,相对路径可以不定义 public class UserManagerContoller { /** * 欢迎 * @return */ /* 1.传统的获取请求的参数方式 * http://localhost:8080/SpringMVC/userManagerContoller/welcome.do?name=wy */ @RequestMapping("/welcome") public ModelAndView welcome(HttpServletRequest request){ ModelAndView mav = new ModelAndView(); String name = request.getParameter("name"); Date today = new Date(); String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(today); mav.addObject("today", date); mav.addObject("name", name); mav.setViewName("welcome"); return mav; } /* 2.restful风格获取请求的参数方式 Spring3.0的一个重要变化(将参数放到了请求路径中) * http://localhost:8080/SpringMVC/userManagerContoller/welcome/wy.do * * 注意点: JVM将Java文件编译成Class文件有两种模式 Debug 和Release * 这两种编译方式的区别是: * Debug 包含额外的调试信息,可以完整的保留变量的名称 (Eclipse 使用的是Debug) * Release 把变量名称使用其他的一些符号代替,量名称就不可见啦 (在使用 javac命令) */ @RequestMapping("/welcome/{param}/{sex}") //前一个“param是防止Release编译下找不到参数名称,因此要指定;要和模板中定义的参数名称一致 //后面一个“param”可以和模板中定义的参数名称不一致,建议还是一致 public ModelAndView welcome(@PathVariable("param") String param, @PathVariable("sex") String xingbie){ ModelAndView mav = new ModelAndView(); mav.addObject("name", param); mav.addObject("sex", xingbie); Date today = new Date(); String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(today); mav.addObject("today", date); mav.setViewName("welcome"); return mav; } /** * 3.不同请求方式(get,post),映射不同的方法 * * value 指定请求路径,method 指定请求方式 */ @RequestMapping(value="/welcome", method=RequestMethod.GET) public ModelAndView requestMethodGet(){ ModelAndView mav = new ModelAndView(); mav.setViewName("welcome"); return mav; } @RequestMapping(value="/hello", method=RequestMethod.POST) public ModelAndView requestMethodPost(){ ModelAndView mav = new ModelAndView(); mav.setViewName("hello"); return mav; } /** * 4. @RequestParam 使用方法和@PathVariable类似(要注意Debug和Release) * http://localhost:8080/SpringMVC/userManagerContoller/welcomeParam.do?username=wy&password=123&age=23 */ @RequestMapping(value="/welcomeParam", method=RequestMethod.GET) public ModelAndView welcome(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("age") int age) { ModelAndView mav = new ModelAndView(); User user = new User(); user.setUsername(username); user.setPassword(password); user.setAge(age); mav.addObject("user", user); mav.setViewName("hello"); return mav; } /** * 5.获取表单中的值 * BindingResult 绑定数据过程中产生的错误注入到BindingResult中。 */ @RequestMapping(value="/welcome", method=RequestMethod.POST) public ModelAndView commonCommod(User user, BindingResult result){ ModelAndView mav = new ModelAndView(); mav.addObject(user); if(result.hasErrors() && result.hasFieldErrors()){ String field = null; Object fieldValue = null; Map<String, Object> map = new HashMap<String, Object>(); List<FieldError> fieldErrors = result.getFieldErrors(); for(FieldError fieldError : fieldErrors){ field = fieldError.getField(); fieldValue = fieldError.getRejectedValue(); map.put(field, fieldValue); } mav.addObject("map", map); mav.setViewName("welcome"); }else{ mav.setViewName("hello"); } return mav; } /** * 属性编辑器 类型转换 * 典型应用: 日期转换 */ @InitBinder public void initBinder(WebRequestDataBinder binder){ binder.registerCustomEditor(Date.class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd"),false)); } public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } /** * 6.常用的参数 * 使用Session有一个前提就是session必须是可用的 */ // public ModelAndView commonArguments(HttpServletRequest request, HttpServletResponse response, HttpSession session, // @CookieValue AnyType cookieName, @RequestHeader("user-Agent") AnyType name, // @PathVariable AnyType variableName, @RequestParam AnyType paramName){ // ModelAndView mav = new ModelAndView(); // // return mav; // } /** * 7.返回类型 * void 、String、AnyType(任意对象)、Model、ModelAndView * 说明:Model继承了Map,为SpringMVC定制的 */ // void @RequestMapping public void commonReturnType(HttpServletResponse response){ try { PrintWriter out = response.getWriter(); out.println("向页面中输出的值"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @RequestMapping public void commonReturnType(PrintWriter out){//其实也是从HttpServletResponse 通过getWriter()得到out out.println("向页面中输出的值"); } @RequestMapping("/commonReturnType") public void commonReturnType(){ //默认生成隐含的viewName(规则测略:按照请求路径${appName/userManagerContoller/commonReturnType.do // ---> userManagerContoller/commonReturnType} // ---> /WEB-INF/page/userManagerContoller/commonReturnType.jsp // ) } // String /** * ModelAndView中的Model * ModelAndView中的View */ @RequestMapping public String commonReturnType(Map<Object, Object> model){//model model.put("", ""); return "viewName"; } //AnyType(任意对象) /** * user放到model中,model(key, value) key默认是取Bean的名称将其首字母小写 即user,value即user * 默认生成隐含的viewName * 在页面上可以使用request.getAttribute("user")或者${user.key} ${user.value} * @return */ @RequestMapping public User commonReturnTypeUser(){// User user = null; return user; } /** * userList放到model中,model(key, value) key默认是框架生成userList,value即user * 默认生成隐含的viewName * 在页面上可以使用request.getAttribute("userList")或者${userList.key} ${userList.value} * @return */ @RequestMapping public List<User> commonReturnTypeUserList(){ List<User> userList = null; return userList; } /** * * 默认生成隐含的viewName * @return */ @RequestMapping public Model commonReturnTypeModel(){ Model model = null; return model; } /** * * @return */ @RequestMapping public ModelAndView commonReturnTypeModelAndView(){ ModelAndView mav = new ModelAndView(); mav.addObject("", ""); mav.setViewName(""); return mav; } }
view层
welcome.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); %> <!DOCTYPE html> <html> <head> <title>welcome.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> This is my annotation HTML page. <br/> 今天是: ${today}<br/> 参数是: ${name} ${sex}<br/> <hr/> <c:forEach var="field" items="${map}"> <c:if test="${field != null}" var="param" scope="page"> 您输入的${field.key}不正确! ${field.value}<br/> </c:if> </c:forEach> <form action="<%=path%>/userManagerContoller/welcome.do" method="post"> 用户名: <input type="text" id="username" name="username" value="wy" /><br/> 密码 : <input type="text" id="password" name="password" value="wy" /><br/> 年龄 : <input type="text" id="age" name="age" value="23wy" /><br/> <input type="submit" value="提交" /> </form> </body> </html>
值得注意的点:
1、@PathVariable("paramName") @RequestParam("paramName") 建议指定参数名称
原因是VM将Java文件编译成Class文件有两种模式 Debug 和Release
这两种编译方式的区别是:
Debug 包含额外的调试信息,可以完整的保留变量的名称 (Eclipse 使用的是Debug)
Release 把变量名称使用其他的一些符号代替,量名称就不可见啦 (在使用 javac命令)
2、restful风格获取请求的参数方式
3、参数类型转换
注册属性编辑器
4、对于无任何输出的方法
@RequestMapping("/commonReturnType") public void commonReturnType(){ //默认生成隐含的viewName(规则测略:按照请求路径${appName/userManagerContoller/commonReturnType.do // ---> userManagerContoller/commonReturnType} // ---> /WEB-INF/page/userManagerContoller/commonReturnType.jsp // ) }
发表评论
-
SpringMVC中内容协商【统一资源多种展现json xml html】
2013-09-12 15:58 3426在我们实际的开发中,往往需要SpringMVC ... -
Spring为某个属性注入值或为某个方法的返回值
2013-08-26 16:02 1490项目中用到需要初始化一些数据,Spring提供了filed的 ... -
SpringMVC 基础知识点小结
2013-08-23 15:26 2269参照:http://zachary-g ... -
使用SpringMVC Restful 开发思考
2013-03-18 14:23 1279一、rest思想 此部分 ... -
Spring MVC Jackson DateFormat
2012-10-14 15:59 2233使用Spring MVC 里的Jackson返回JSON时,遇 ... -
SpringMVC 中文件上传 MultipartResolver
2011-12-17 17:44 55171基于前面文章的基础上。 一、准备 需要的jar ... -
SpringMVC 异常处理初探
2011-12-12 12:18 8240Web应用中对于异常的处理方式与其他形式的应用并没有太大的不同 ... -
SpringMVC 使用JSR-303进行校验 @Valid
2011-12-11 18:04 31563一、准备校验时使用的JAR 说明: ... -
SringMVC 注解标记备忘录
2011-12-10 22:42 2136Spring MVC注解开发中常用标签,如下表: ... -
SpringMVC拦截器简单使用
2011-12-10 22:17 93574基于上一篇文章的基础上 一、拦截器的配置 1、 ... -
SpringMVC生成JSON(三)
2011-12-10 01:16 20641基于上一篇文章的代码基础上 一、准备工作 1、 下载依赖库 ... -
SpringMVC生成JSON(二)
2011-12-06 21:24 8279基于上一篇文章的代码基础上 开始Jackson之旅。 一、准 ... -
SpringMVC 生成JSON(一)
2011-12-04 19:37 3312本示例基于前面几篇文章的代码。 一、JSON-lib框 ... -
Spring MVC处理重定向的传参
2011-12-03 21:35 6543一、Spring MVC是如何处理重定向的传参? 现提供一种 ... -
Spring MVC3.0的RESTFul方式的访问
2011-12-03 20:59 1635上一篇以简单介绍了 ... -
SpringMVC例子代码小汇总
2011-11-20 11:18 1906一、结构 二、Jar版本及使用jar包 ... -
SpringMVC 拦截器实现分析
2011-11-20 00:10 5393一、Servlet Filter与Spring interce ... -
SpringMVC学习笔记(三) --- 映射处理器(续)
2011-10-07 21:46 1673<?xml version="1.0" ... -
SpringMVC学习笔记(二) --- 后端控制器之MultiActionController(一)
2011-10-07 21:07 2047创建处理多个请求的控制器 根据"每个请求一个 ... -
SpringMVC学习笔记(二) --- 后端控制器之CommandController、 FormController(三)
2011-10-07 16:09 2991另一种表单封装的参数的Controller是AbstractC ...
相关推荐
SpringMVC注解驱动的控制器详解,具体效果与过程看博文 http://blog.csdn.net/evankaka/article/details/45562951
刚接触SpringMVC几天、代码肯定比不上大佬ε...初步使用反射注解实现动态调用方法 初步了解SpringMVC @Controller、@RequestMapping、@requestParam用法及原理 _φ(❐_❐✧ 人丑就要多读书 不熬夜不追剧~( ̄▽ ̄)~*
@Controller 是 SpringMVC 中最基本的注解之一,该注解用于标记一个类是 Controller,控制器 Controller 负责处理由 DispatcherServlet 分发的请求。使用@Controller 标记的类可以处理用户请求,并将请求数据经过...
1. **@Controller**:这个注解用于标记一个类作为SpringMVC的控制器。控制器类将处理HTTP请求,并调用业务逻辑方法。 2. **@RequestMapping**:此注解用于映射HTTP请求到特定的方法。可以放在类级别或方法级别,...
springmvc基础 包含代码+知识点+详细解释 1. 什么是springmvc? 2. springmvc框架原理 ...5. springmvc注解开发 常用的注解学习 参数绑定(简单类型、pojo、集合类型) 自定义参数绑定 6. springmvc和struts2区别
**定义**: `@Controller` 注解是用来标记一个类作为控制器(Controller)组件,在Spring MVC框架中扮演着请求处理者的角色。 **作用**: 通过这个注解,可以将一个普通的Java类变为Spring管理的Bean,并且将该Bean...
1. **@Controller**:这是 Spring MVC 中的核心注解,标记在一个类上表示该类是一个控制器,负责处理来自客户端的请求。控制器类通常包含多个处理方法,每个方法对应一个特定的HTTP请求。 2. **@RequestMapping**:...
在Spring MVC中,注解式控制器是开发Web应用的核心组件之一。它允许开发者通过在控制器方法上使用注解来处理HTTP请求,同时提供了强大的数据验证、类型转换和格式化功能,确保了输入数据的准确性和安全性。下面我们...
SpringMVC注解开发是Java Web开发中一种高效的方式,它极大地简化了控制器的定义和请求处理。在SpringMVC框架中,`@Controller`注解用于标识一个类作为处理HTTP请求的控制器。这个注解使得类中的方法可以被SpringMVC...
在非注解方式下,我们通常会通过XML配置文件来定义控制器(Controller)、视图解析器(View Resolver)以及模型-视图-适配器(M-V-A)组件。控制器接收HTTP请求,调用业务逻辑,然后将结果传递给视图进行展示。在...
【SpringMvc注解详解】 SpringMvc 是 Spring 框架的一部分,主要负责处理 Web 请求。在 SpringMVC 中,注解扮演着至关重要的角色,它们简化了代码并减少了配置。以下是一些常用的 SpringMVC 注解及其详细解释: 1....
【标题】"spring+mybatis+springmvc 全注解框架"揭示了这是一个基于Java的Web开发框架,其中集成了Spring、MyBatis和SpringMVC这三个关键组件。Spring是全面的企业级应用框架,提供了依赖注入(DI)和面向切面编程...
SpringMVC通过注解可以极大地简化配置,如`@Controller`、`@RequestMapping`等,使得控制器类的编写更加直观。 ### MyBatis MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免...
`DispatcherServlet`作为SpringMVC的核心组件之一,主要负责接收客户端请求、分发请求给相应的控制器以及渲染视图等工作。为了使`DispatcherServlet`正常工作,我们需要在`web.xml`文件中进行相应的配置。 ##### ...
通过注解,如@Controller、@RequestMapping等,我们可以轻松地定义控制器并映射URL,实现视图和数据的分离,使Web应用的结构更加清晰。 3. **MyBatis**: MyBatis 是一个优秀的持久层框架,它支持定制化SQL、存储...
SpringMVC利用注解来声明式地配置控制器、模型属性、视图解析等,极大地减少了XML配置文件的需求。 1. **@Controller** 注解:这个注解标记一个类作为Spring MVC的控制器。例如: ```java @Controller public class...
@RequestMapping注解可以用在类上和方法上,用于映射请求和约束当前控制器只能处理什么类型的请求。 五、获取Servlet原生API 获取Servlet原生API可以通过实现一个登陆验证的控制器,成功跳转到success.jsp,失败...
拦截器是 SpringMVC 中的一种回调机制,它们在请求被控制器处理之前或之后执行。通过实现 HandlerInterceptor 接口或继承 AbstractHandlerInterceptorAdapter 类,你可以自定义拦截逻辑。主要方法包括 `preHandle`...
SpringMVC通过DispatcherServlet作为前端控制器,结合Model、View和Controller三部分,实现了Web应用的松耦合。 **MyBatis** MyBatis是一个优秀的持久层框架,它简化了SQL操作,允许开发者直接编写SQL语句,避免了...