打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Spring MVC 注解开发备忘录
此文章不是Spirng MVC讲解,相关文章大家可以自行Google。
先来看一下Spring MVC注解开发中常用标签,如下表:
编号
注解
说明
位置
备注
1
@Controller
将类变成 Spring Bean
现阶段 @Controller 、 @Service 以及 @Repository 和 @Component 注解的作用是等价的
2
@RequestMapping
请求映射
类、方法
标注在类上意指类实现 Controller 接口
标注在方法上意指扩展 Spring 预定义 Controller ( 如 :SimpleFormController)
3
@RequestParam
入参绑定 URL
入参
指定 URL 参数与方法入参的绑定规则
4
@SessionAttributes
设定 Session 范围属性
如: @SessionAttributes("user") ,将把 ModelMap 中的 user 属性添加到 Session 范围
5
@InitBinder
注册 Controller 级的自定义属性编辑器
方法
@InitBinder 注解的方法必须拥有一个 WebDataBinder 类型的入参,以便 Spring MVC 框架将注册属性编辑器的 WebDataBinder 对象传递进来
6
@ModelAttribute
准备引用数据 / 将 ModelMap 属性绑定到入参
方法、入参
标注在方法上:准备引用数据
标注在入参上:将 ModelMap 中的属性绑定到请求处理方法的入参中
再来看一下Controller中方法的入参类型:
编号
请求处理方法入参的可选类型
说明
1
Java 基本数据类型和 String
默认情况下将按名称匹配的方式绑定到 URL 参数上,可以通过 @RequestParam 注解改变默认的绑定规则
2
request/response/session
既可以是 Servlet API 的也可以是 Portlet API 对应的对象, Spring 会将它们绑定到 Servlet 和 Portlet 容器的相应对象上
3
org.springframework.web.context.request.WebRequest
内部包含了 request 对象
4
java.io.InputStream/java.io.Reader
可以借此访问 request 的内容
5
java.io.OutputStream / java.io.Writer
可以借此操作 response 的内容
6
任何标注了 @RequestParam 注解的入参
被标注 @RequestParam 注解的入参将绑定到特定的 request 参数上。
7
java.util.Map / org.springframework.ui.ModelMap
它绑定 Spring MVC 框架中每个请求所创建的潜在的模型对象,它们可以被 Web 视图对象访问(如 JSP )
8
命令 / 表单对象(注:一般称绑定使用 HTTP GET 发送的 URL 参数的对象为命令对象,而称绑定使用 HTTP POST 发送的 URL 参数的对象为表单对象)
它们的属性将以名称匹配的规则绑定到 URL 参数上,同时完成类型的转换。而类型转换的规则可以通过 @InitBinder 注解或通过 HandlerAdapter 的配置进行调整
9
org.springframework.validation.Errors / org.springframework.validation.BindingResult
为属性列表中的命令 / 表单对象的校验结果,注意检验结果参数必须紧跟在命令 / 表单对象的后面
10
rg.springframework.web.bind.support.SessionStatus
可以通过该类型 status 对象显式结束表单的处理,这相当于触发 session 清除其中的通过 @SessionAttributes 定义的属性
再来看一下Controller中方法的返回类型:
编号
请求处理方法入参的可选类型
说明
1
void
此时逻辑视图名由请求处理方法对应的 URL 确定,如以下的方法:
@RequestMapping("/welcome.do")
public void welcomeHandler() {
}
对应的逻辑视图名为“ welcome ”
2
String
此时逻辑视图名为返回的字符,如以下的方法:
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("ownerId") int ownerId, ModelMap model) {
Owner owner = this.clinic.loadOwner(ownerId);
model.addAttribute(owner);
return "ownerForm";
}
对应的逻辑视图名为“ ownerForm ”
3
org.springframework.ui.ModelMap
和返回类型为 void 一样,逻辑视图名取决于对应请求的 URL ,如下面的例子:
@RequestMapping("/vets.do")
public ModelMap vetsHandler() {
return new ModelMap(this.clinic.getVets());
}
对应的逻辑视图名为“ vets ”,返回的 ModelMap 将被作为请求对应的模型对象,可以在 JSP 视图页面中访问到。
4
org.springframework.web.servlet.ModelAndView
当然还可以是传统的 ModelAndView 。
具体使用请参考如下LoginController
Java代码
package com.zhang.controller.anno;       import javax.servlet.ServletRequest;    import javax.servlet.http.HttpSession;       import org.springframework.stereotype.Controller;    import org.springframework.ui.ModelMap;    import org.springframework.validation.BindingResult;    import org.springframework.web.bind.annotation.ModelAttribute;    import org.springframework.web.bind.annotation.RequestMapping;    import org.springframework.web.bind.annotation.RequestMethod;    import org.springframework.web.bind.annotation.SessionAttributes;    import org.springframework.web.bind.support.SessionStatus;    import org.springframework.web.servlet.ModelAndView;    import org.springframework.web.servlet.view.RedirectView;       import com.zhang.bean.User;    import com.zhang.validator.UserValidator;       @Controller   // 声明为Spring Bean    @SessionAttributes({ "usersession","testSession" })    // 将model特定属性绑定到session中    public class LoginController {           /**        * 此方法判断参数中是否包含"CE"字参数,如果包换将CE参数放入Model中,并渲染login视图        *         * 这里仅仅为测试使用,获取Redirect后的URL参数放入model中再转发出去        *         * @param request        * @param model        * @return        */       @RequestMapping(value = "/login2.htm", params = { "CE" }, method = RequestMethod.GET)        public String redirect(ServletRequest request, ModelMap model) {            model.addAttribute("user", new User());            String ce;            try {                ce = new String(request.getParameter("CE").getBytes("ISO-8859-1"),                        "utf8");                model.addAttribute("CE", ce);            } catch (Exception e) {                e.printStackTrace();            }               return "login";        }           /**        *         * 此方法为login.htm首页面使用        *         * 因为login中需要User信息回显(校验),故此处需必须传入一个空User 否则页面报异常        *         * @param request        * @param model        * @return        */       @RequestMapping(value = "/login2.htm", method = RequestMethod.GET)        public String test(ServletRequest request, ModelMap model) {            model.addAttribute("user", new User());            return "login";        }           /**        *         * @param session        *            Http Session        * @param user        *            表单模型User,@ModelAttribute表示user来源于model(request\session)        * @param result        *            表单验证结果,必须放在user之后        * @param model        *            数据模型        * @param status        *            可清除由@SessionAttributes定义的session范围的属性        * @return        */          @RequestMapping(value = "login2.htm", method = RequestMethod.POST)        public ModelAndView login(HttpSession session, ServletRequest request,                @ModelAttribute("user") User user, BindingResult result,                ModelMap model, SessionStatus status) {            ModelAndView ret = new ModelAndView();            // 验证用户,此处UserValidator为自定义验证类            new UserValidator().validate(user, result);            if (!result.hasErrors()) {// 如果校验通过,重定向到指定页面                model.addAttribute("CE", "测试");                ret.setView(new RedirectView("login.htm"));            } else {                ret.setViewName("login");            }               /*            * 测试@SessionAttributes            */              // 第一次为空            String sessionValue = (String) session.getAttribute("testSession");            System.out.println("sessionValue:" + sessionValue);            // 将值放入模型(request范围),同时由于@SessionAttributes的作用,也放入了session范围            model.addAttribute("testSession", "My_SessionValue");               /*            * 测试@SessionAttributes结束            */              // status.setComplete();//清除此次请求@SessionAttributes            // 指定的session值(此处没有作用,因为user并未绑定到session)            try {                // request.setCharacterEncoding("utf8");//可以使用此方法避免Post乱码,或者配置filter            } catch (Exception e) {                e.printStackTrace();            }            return ret;        }    }
web.xml配置
Xml代码
<?xml version="1.0" encoding="UTF-8"?>   <!-- 在tomcat5.5下运行,需要使用Servlet 2.4版本(jstl1.1.jar,standard.jar)tomcat6可以使用默认的2.5 -->   <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">       <display-name></display-name>          <!-- 注册配置文件读取器 -->       <listener>           <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>       </listener>               <!-- 添加Spring过滤器,解决POST时乱码问题,但GET方式需要自己手工处理 -->       <filter>           <filter-name>Set Character Encoding</filter-name>           <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>           <init-param>               <param-name>encoding</param-name>               <param-value>utf8</param-value>           </init-param>       </filter>       <filter-mapping>           <filter-name>Set Character Encoding</filter-name>           <url-pattern>/*</url-pattern>       </filter-mapping>          <!-- 配置文件列表,加载相关xml文件,其中springapp-servlet.xml可以不配置,DispatcherServlet配置中会自动加载 -->       <context-param>           <param-name>contextConfigLocation</param-name>           <param-value>classpath:applicationContext.xml</param-value>       </context-param>             <!-- Spring MVC 的Servlet,它将加载WEB-INF/xxx-servlet.xml 的 配置文件,以启动Spring MVC模块 -->       <servlet>           <servlet-name>springapp</servlet-name>           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>           <load-on-startup>1</load-on-startup>       </servlet>       <servlet-mapping>           <servlet-name>springapp</servlet-name>           <url-pattern>*.htm</url-pattern>       </servlet-mapping>          <!-- 使用Srping 标签时需配置 -->       <jsp-config>           <taglib>               <taglib-uri>/spring</taglib-uri>               <taglib-location>/WEB-INF/tld/spring-form.tld</taglib-location>           </taglib>       </jsp-config>          <welcome-file-list>           <welcome-file>index.jsp</welcome-file>       </welcome-file-list>   </web-app>
下面给出Spring MVC 相关配置文件
springapp-servlet.xml
Xml代码
<?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:p="http://www.springframework.org/schema/p"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd        http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context-2.5.xsd">          <!-- 1:对web包中指定包中所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->       <context:component-scan base-package="com.zhang.controller.anno" />          <!-- 2:启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->       <bean           class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />          <!-- Spirng 默认启动三个apapter 如果自定义了一个会忽略其他的,当 beanNameUrlMapping 与annotation同时存在时要显示声明             所有 即:当注解形式与声明形式同时开发时需要执行一下三行 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"             /> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"             /> <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"             /> -->             <!-- 3:对模型视图名称的解析,即在模型视图名称添加前后缀 -->       <bean id="viewResolver"           class="org.springframework.web.servlet.view.InternalResourceViewResolver">           <property name="viewClass">               <value>org.springframework.web.servlet.view.JstlView</value>           </property>           <property name="prefix">               <value>/WEB-INF/jsp/</value>           </property>           <property name="suffix">               <value>.jsp</value>           </property>       </bean>          <!-- 定义消息源,用于国际化 -->       <bean id="messageSource"           class="org.springframework.context.support.ResourceBundleMessageSource">           <property name="basename">               <value>messages</value>           </property>       </bean>   </beans>
视图部分文件:
include.jsp
Java代码
<%@ page session="false"%>    <%@ page isELIgnored ="true" %>    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>    <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
login.jsp
Java代码
<%@ include file="/WEB-INF/jsp/include.jsp"%>    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>    <%@ page contentType="text/html; charset=utf8"%>    <html>        <head>            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />            <style type="text/css">    .error {        color: red;    }    </style>            <title>Login</title>        </head>        <body>            <form:form method="post" commandName="user">                <table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0"                   cellpadding="5">                    <tr>                        <td align="left" width="30%">                            username:                            <form:input path="username" />                        </td>                           <td width="30%">                            <form:errors path="username" />                        </td>                    </tr>                    <tr>                        <td align="left" width="30%">                            password:                            <form:input path="password" />                        </td>                        <td width="30%">                            <form:errors path="password" />                        </td>                    </tr>                    <tr>                        <td>                            <form:errors path="validatorMessage" />                        </td>                    </tr>                   </table>                <input type="submit" value="Execute">            </form:form>            <a href="<c:url value="hello.htm"/>">Home</a>            <c:out value="${CE}"></c:out>        </body>    </html>
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
spring3 MVC实战,手工搭建Spring3项目demo
spring Mvc 教程框架实例以及系统演示下载
史上最全最强SpringMVC详细示例实战教程
Spring MVC3.0.5搭建全程
jsp中script引入url项目名${appName}或${app}等
使用annotation注解,整合DWR3 + Spring3 + Hibernate3
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服