Spring MVC 3 -- annotation 配置

原文

Web.xml

<servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 默认查找mvc-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/spring/*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>


spring/servlet.xml

<mvc:annotation-driven/> <context:component-scan base-package="com.los.mvc.controller"/> <!-- Spring MVC 3.0 引入restFul风格 (表述性状态转移)--> <!-- ViewResolver & View 映射关系--> <!-- InternalResourceViewResolver 基于resource对jsp/jstl的支持 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> <!-- InternalResourceViewResolver viewClass默认值就是JstlView --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> </bean> <!-- 拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/*"/> <bean class="com.los.mvc.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> <!-- 国际化配置 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- <property name="basename" value="message"></property> --> <property name="basenames"> <list><value>message</value></list> </property> </bean>


Controller class

import java.text.SimpleDateFormat; import java.util.Date;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; 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;

@RequestMapping(value = "/test") @Controller public class TestController { @RequestMapping(value = "/start/{name}/{age}") public String start(@PathVariable(value = "name") String name, @PathVariable(value = "age") String age, HttpServletRequest request, HttpServletResponse response) { System.out.println(name + " : " + age); return "start"; }

@RequestMapping(value = "/domethod", method = RequestMethod.GET) public String doMethod1(HttpServletRequest request, HttpServletResponse response) { System.out.println("Get ..."); return "doGet"; }

@InitBinder() public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date.class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd"), true)); } }

Interceptor class

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub System.out.println("MyInterceptor afterCompletion()..."); }

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav) throws Exception { // TODO Auto-generated method stub System.out.println("MyInterceptor postHandle()..."); }

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("MyInterceptor preHandle()..."); return true; } }

Spring MVC 3.0 引入restFul风格 (表述性状态转移)
(1.将请求的参数作为url的一部分来存在,test.do?name=zhangsan ==> test/zhangsan.do,根据不同的参数做不同的请求)
(2.通过@PathVariable url temp模版来实现 注释中加入@RequestMapping(value = "/start/{name}")
方法中(参数里加入@PathVariable("name") String name)将模版的一部分注入到参数中)

@RequestMapping(value = "/test") @Controller class{ @RequestMapping(value = "/start/{name}") method(@PathVariable String name ,request,response) }


@RequestMapping可以根据不同的请求方法映射到不同的方法
eg:@RequestMapping(value = "/domethod", method = RequestMethod.GET)只有请求方法是get的时候才能请求到这方法.
@InitBinder() public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date.class ,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); }


注解mvc的请求参数设置没有个数先后限制:
(1)没有任何参数()
(2)@PathVariable 任何类型
(3)request,response,session
(4)@RequestParam request参数
(5)@CookieValue CookieName
(6)@RequestHeader 请求头 @RequestHeader("user-Agent")获取浏览器
(7)PrintWriter out 直接获取response writer 对象
(8)Map Model对象 在参数里定义,然后在方法里注入对象,再自动返回.
(9)command对象,在参数里定义user对象 在匹配的情况下会被自动封装.
(10)BindingResult result,在command对象值绑定值注入的情况下判断是否有绑定错误.
注解mvc的返回值参数:
* 1.void out.print输出情况下用void,如无out则会生成隐含的viewName是按请求路径解析出来的
* ${appName}/test/xxx.do --> 视图名 test/xxx --->/web-inf/views/test/xxx.jsp
* 2.String viewName 同样能返回model.
* 3.任意类型.eg:User同样放入Model中.key默认为user 类名.视图按void方式默认解析出视图.
* 4.List<user>类型, 也会加入Model中.key默认为userList.
* 5.Map类型 Model(Spring中有Model类)
* 6.ModelAndView 标准的.

ViewResolver & View
1.Redirect 重定向视图
防止刷新重复提交. servlet中有request.forward 方法.带着参数从请求A经过server转到请求B.则不会告诉Browser Client请求变化. response.redirect 方法.从请求A -->server -->Browser Client 重定向到 B
spring mvc中返回("redirect:/user_list") 这是个重定向的视图.
2.JSTLView
3.ExcelView
4.PDFView
5.JsperReport
6.以及其他自定义view

拦截器,视图的国际化,验证
1.拦截器(Interceptor):在请求到达之前或者之后加入的提前的处理过程,eg:全局的日志.权限管理.
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/*"/> <bean class="com.los.mvc.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>


public class MyInterceptor implements HandlerInterceptor

preHandle
拦截的动作
handler为下一个过程的处理对象.可能是下一个拦截器对象 或者是 controller
返回true 继续进行,返回false 则拒绝转到其他视图.
postHandle
控制器已经执行完,生成视图之前可以做的动作.逆向的拦截器.eg:向模型中加入公共成员.
afterCompletion
释放资源.eg:关闭对象.
2.国际化
jsp页面引入spring标签,<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<spring:message code="welcome"></spring:message> 去资源文件里找welcome对应不同的语种有不同的显示方式.
配置文件中设置:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames" <list> <value>message</value> </list> </property> </bean>


name="basenames" 多个资源文件 / value="message" "message"为资源文件的名称.

3.验证
两种做法,1.前端js验证 2.后端验证.
后台验证根据JSR3.0.3标准.Hibernate Validate 4.1 是JSR303标准的实现.
在controller方法内使用@Valid注解,能将当前传入的对象进行验证.
如果错误的话结果会放在BindingResult对象里
验证需要在User Bean里加注解 eg :@notEmpty
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!-- JSTL标签 -->
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> <!-- Spring标签 -->



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值