SpringMVC
本周简单学习使用了一下SpringMVC,各种爽快在心头
1.首先说一下对我观点颠覆的一个地方,以前不太看好将配置转注解,一方面是自己使用惯了配置,程序结构清晰明了,反观注解,如果项目较小,你会觉得开发起来一气呵成,极端爽快,但是可以预见的是如果项目边的过于庞大,那么查找定位就显得比较费劲了,可能很多时候包名,类名就成了类管理的一种默认(这难道就是约定由于配置(约定优于配置)?),所以这就需要团队之间快速达成共识了,说说SpringMVC的最爽的注解@Controller及@RequestMapping("/login"),这个可以让你省去配置请求跟类之间的对应关系,而且可以做到真正的“一致性”,不过目前还不是很清楚如果某人也顶一个了相同的login该怎么区别?这个只有在应用打包的时候有spring做后知后觉的检测了。
SpringMVC从3.1开始引入了hibernate的校验,感觉也是一个很好用的东西,不需要配置文件,通过annotation就可以,这样做的好处是:你可以控制错误的输出方式,相比webx;
例如:实体类
package com.mybank.domain; import javax.validation.constraints.Size; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotEmpty; public class UserInfo { private long id; @Size(max=25,message="用户昵称太长了") private String userNick; @NotEmpty(message="邮箱不能为空") @Email(message="请填写正确格式") private String userEmail; @NotEmpty(message="密码不能为空哦") @Size(min = 1, max = 25,message="密码请控制在1~25个字符之间") private String userPassword; private int status; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUserNick() { return userNick; } public void setUserNick(String userNick) { this.userNick = userNick; } public String getUserEmail() { return userEmail; } public void setUserEmail(String userEmail) { this.userEmail = userEmail; } }
处理的类:
@RequestMapping("/register") public @ResponseBody Map<String, Object> register(@Valid UserInfo userInfo, BindingResult result) { Map<String, Object> model = new HashMap<String, Object>(); String code = "0"; String message = ""; if (result.hasErrors()) { for (FieldError fieldError : result.getFieldErrors()) { model.put(fieldError.getField(), fieldError.getDefaultMessage()); } return model; } String sql = "INSERT INTO user_info (user_email, user_nick,user_password,gmt_create,gmt_modified,status) VALUES (?,?,?,?,?,?)"; String querySql = "select * from user_info where user_email=?"; UserInfo ownerInfo = null; try { ownerInfo = jdbcTemplate.queryForObject(querySql, new Object[] { userInfo.getUserEmail() }, new BeanPropertyRowMapper<UserInfo>(UserInfo.class)); } catch (EmptyResultDataAccessException e) { message = "您已经注册过了"; } if (ownerInfo == null || ownerInfo.getStatus() != Constants.NORMAL_STATUS) { int i = jdbcTemplate.update(sql, userInfo.getUserEmail(), userInfo.getUserNick(), userInfo.getUserPassword(), new Date(), new Date(), Constants.NORMAL_STATUS); if (i > 0) { code = "200"; message = "注册成功"; } else { message = "注册失败"; } } else { message = "您已经注册过了"; } model.put("code", code); model.put("message", message); return model; }
这样,校验信息就可以顺利的转成json返回给前端,而大部分使用的校验框架基本都是在请求进入action前就处理,这样的好处是及时返回,坏处是返回格式不易控制。校验需要使用的jar包
hibernate-validator-4.1.0.Final.jar javax.validation-1.0.0.GA.jar slf4j-api-1.6.1.jar commons-logging-1.1.1.jar
如果你需要返回json类型还需要如下jar包
jackson-core-asl-1.9.10.jar jackson-mapper-asl-1.9.10.jar
由于只是自己玩,所以懒得加入一堆jar,所以dao还是使用了Spring的JDBCTemplate,再者我是个很懒得人,所以不太喜欢自己从ResultSet里边一一对应的取值复制,所以百度终得其解,不过也有些限制做法如下:
userInfo = jdbcTemplate.queryForObject( sql, new Object[] { userInfo.getUserEmail(), userInfo.getUserPassword() }, new BeanPropertyRowMapper<UserInfo>(UserInfo.class));
在查询的时候传入的RowMapper使用:BeanPropertyRowMapper,由Spring完成这一步,不过前提是属性使用驼峰(完全按照数据库字段定义属性也可以,不过估计没人愿意这么干)具体的如果出错了,参加源码应该也可以很好的理解的。
哇咔咔,这个BeanPropertyRowMapper实在是省事啊。
对了其实我的SpringMVC的配置文件也相对比较简单如下:
<?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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 启用spring mvc 注解 --> <context:annotation-config /> <mvc:annotation-driven /> <mvc:default-servlet-handler /> <!-- 设置使用注解的类所在的jar包 --> <context:component-scan base-package="com.mybank.action"></context:component-scan> <!-- 完成请求和注解POJO的映射 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> --> <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="" /> <property name="suffix" value=".jsp" /> </bean> </beans>
其中context:component-scan这个可以配置空值
<context:annotation-config /> <mvc:annotation-driven /> <mvc:default-servlet-handler />
这三个可以让你省去一大堆配置
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="" /> <property name="suffix" value=".jsp" /> </bean>
这个貌似必须配置,否则你的应用就找不到处理完成后的响应视图了
期间遇到一些问题最终定位到是因为java文件保存格式为
一番百度算是解决了,参见我的这篇blog
http://tzwzero-163-com.iteye.com/blog/1696605
上一篇: EMF校验框架
下一篇: 取消Validator的验证