前一天试用了一下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如下:
<?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开头.具体如下:
<?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只是一个页面级的例子,所以这里为空
<?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处理方法,代码大致如下:
@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说明需要具体校验的种类,方式
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这里就不贴了
##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的如何定义,如下:
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的具体目录下,就可以看到页面了
心情: 一般