springmvc初试
作者: chua | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.meichua.com/archives/88.html
前一天试用了一下spring mvc总体感觉还是很方便的,当然查文档另算.
spring mvc需要的包有:
spring.jar spring 核心哭
spring-webmvc.jar spring mvc库
spring-modules-validation.jar 校验库
commons-lang-2.3.jar
servlet-api.jar
velocity-1.5-dev.jar
commons-logging-1.1.jar
log4j-1.2.12.jar
commons-collections-3.1.jar
现在来说一下具体步骤:
1:创建web.xml文件,这里需要引入spring mvc的初始化参数及dispatcher,web.xml如下:
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 | <?xml version="1.0" encoding="ISO-8859-1"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> . . <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>sample</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>sample</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> . . </web-app> |
2: 创建sample-servlet.xml,web.xml中的DispatcherServlet会自动载入此文件,不过命名规则就是servlet的 name和此文件”-”之前的开头必须一致,如这里web.xml中DispatcherServlet的name为”sample”,次文件必须以 sample开头.具体如下:
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 39 40 41 42 43 44 45 46 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> <!-- MultipartResolver for parsing file uploads, implementation for Commons FileUpload --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> <!-- Configurer that sets up a shared VelocityEngine for Velocity views --> <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="WEB-INF/views/"/> <property name="velocityPropertiesMap"> <props> <prop key="input.encoding">UTF-8</prop> <prop key="output.encoding">UTF-8</prop> <!--in dev may use, in runtime modify the velocity templates--> <!--prop key="resource.loader">file</prop> <prop key="file.resource.loader.class">org.apache.velocity.runtime.resource.loader.FileResourceLoader</prop> <prop key="file.resource.loader.path">E:/projects/sample/war/WEB-INF/views/</prop> <prop key="file.resource.loader.cache">false</prop--> </props> </property> </bean> <!-- Simple ViewResolver for Velocity, appending ".vm" to logical view names --> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="suffix" value=".vm"/> <property name="contentType"><value>text/html; charset=UTF-8</value></property> <property name="requestContextAttribute"><value>requestContext</value></property> </bean> <!-- Enable annotation-based validation using Bean Validation Framework --> <bean id="configurationLoader" class="org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader"/> <bean id="validator" class="org.springmodules.validation.bean.BeanValidator" p:configurationLoader-ref="configurationLoader"/> <!-- Load messages ,a error message file, can be used to put to pages--> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource" p:basename="classpath:errors"> <!--property name="basename"> <value>errors</value> </property--> <property name="defaultEncoding" value="utf-8" /> </bean> <!-- auto scan my define package, the controller with annotation will be load--> <context:component-scan base-package="com.meichua.sample.web.controller"/> </beans> |
3:applicationContext.xml,这个文件一般定义业务逻辑的bean,sample只是一个页面级的例子,所以这里为空
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?xml version="1.0" encoding="UTF-8"?> <!-- - Middle tier application context definition for the image database. --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> </beans> |
4: 创建一个controller,class前加入controller和Mapping url的annotation,class中用Autowired的annotation自动注入form 校验的validator.以及RequestMapping两个request的GET,POST处理方法,代码大致如下:
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 | @Controller @RequestMapping("/register.htm") public class RegisterController { private static final Log log = LogFactory.getLog(RegisterController.class); @Autowired private Validator validator; public void setValidator(Validator validator) { this.validator = validator; } @RequestMapping(method = RequestMethod.GET) public String regsiter(@ModelAttribute("registerData") RegisterData registerData) { return "register"; } @RequestMapping(method = RequestMethod.POST) public String regsiter(@ModelAttribute("registerData") RegisterData registerData, BindingResult result) { try { validator.validate(registerData, result); } catch(Exception e) { log.error("something error!", e); return "register"; } if (result.hasErrors()) { return "register"; } . . //todo same business logic . . return "redirect:registerSuccess.htm"; } } |
5:创建form提交RegisterData对象,并用annotation说明需要具体校验的种类,方式
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 39 40 41 42 43 44 45 | public class RegisterData { @NotBlank @Length(min = 6, max = 14) private String loginId; @NotBlank @Length(min = 6, max = 14) private String password; @Expression(value = "verifyPassword == password") private String verifyPassword; private int age; @NotBlank @Email private String email; public int getAge() { return age; } . . public void setVerifyPassword(String verifyPassword) { this.verifyPassword = verifyPassword; } // Validation Methods @ValidationMethod(forProperty = "age", args = "18,100") private boolean validateAge() { return age >= 18 && age <= 100; } @ValidationMethod(forProperty = "loginId") private boolean validateLoginId() { try { Pattern pattern = new Perl5Compiler().compile("([a-z_A-Z]|[0-9])*", Perl5Compiler.READ_ONLY_MASK | Perl5Compiler.SINGLELINE_MASK); PatternMatcher matcher = new Perl5Matcher(); return matcher.matches(this.loginId, pattern); } catch (MalformedPatternException e) { return false; } } } |
6:编写register.vm,registerSuccess.vm这里就不贴了
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | ##spring.vm的宏springShowErrors似乎有点问题
#macro( showErrors $separator $classOrStyle )
#foreach($error in $status.errorMessages)
#if($classOrStyle == "")
<b>${error}</b>
#else
<span ${classOrStyle}>${error}</span>
#end
${separator}
#end
#end
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
<!--
.td_left { color: #0099ff;}
.em (color: #CC0000)
-->
</style>
</head>
<body>
<table width="800" align="center">
<tr>
<td>
<fieldset style="padding-top: 2em;">
<legend>快速注册</legend>
<form id="regform" method="post" action="/sample/register.htm">
<input type="hidden" name="iu" value="" id="iu" />
<table align="center">
<tr>
<td class="td_left">注册用户:</font></td>
<td>#springFormInput("registerData.loginId" "")</td>
</tr>
<tr>
<td></td><td><font color="#cc0000">#showErrors("<br/>" "")</font></td>
</tr>
<tr>
<td class="td_left">登录密码:</td>
<td>#springFormPasswordInput("registerData.password" "")</td>
</tr>
<tr>
<td></td><td><font color="#cc0000">#showErrors("<br/>" "")</font></td>
</tr>
<tr>
<td class="td_left">验证密码:</td>
<td>#springFormPasswordInput("registerData.verifyPassword" "")</td>
</tr>
<tr>
<td></td><td><font color="#cc0000">#showErrors("<br/>" "")</font></td>
</tr>
<tr>
<td class="td_left">您的邮箱:</td>
<td>#springFormInput("registerData.email" "")</td>
</tr>
<tr>
<td></td><td><font color="#cc0000">#showErrors("<br/>" "")</font></td>
</tr>
<tr>
<td class="td_left">您的年龄:</td>
<td>#springFormInput("registerData.age" "")</td>
</tr>
<tr>
<td></td><td><font color="#cc0000">#showErrors("<br/>" "")</font></td>
</tr>
</table>
<table align="center">
<br>
<tr>
<td><input type="submit" value="注册用户"/></td>
</tr>
</table>
</form>
</fieldset>
</td>
</tr>
</table>
</body>
</html> |
7: 编写errors.properties,这个文件可以放到classpath下,也可以放到WEB-INF下,具体看在sample-servlet.xml的如何定义,如下:
1 2 3 4 5 6 7 8 9 10 11 | RegisterData.loginId[not.blank]=请输入您的登录名! RegisterData.loginId[length]=请输入的登录名长度必须是6-14个字符! RegisterData.loginId[loginIdExist]=登录名已经存在,请使用其他登录名! RegisterData.loginId[validateLoginId()]=登录名有含有非法字符,只能由半角英文字符,下滑线,阿拉伯数字组成! RegisterData.password[not.blank]=请输入您的登录密码! RegisterData.password[length]=登录密码长度不能大于12个字符! RegisterData.verifyPassword[expression]=验证密码和密码不匹配! RegisterData.email[not.blank]=邮箱地址不能为空! RegisterData.email[email]=邮箱地址格式不正确! RegisterData.age[not.blank]=您的年龄不能为空! RegisterData.age[validateAge()]=您的年龄不正确! |
8:打成war包,放到jboss或tomcat的具体目录下,就可以看到页面了