知识在于总结,两个月前做的东西,现在就感觉有点模糊,更别提以后了,所以定期的总结是很必要的。
前段时间项目上了sso,用的是耶鲁大学的CAS,关于sso就不啰嗦太多给出一个链接,这里讲的已经很详细了http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html
这个CAS里面用的是spring的mvc,以前看spring的时候,mvc都是忽略的,因为很少用。这次用到它还真有点抓狂,所以临时抱佛脚,捧了三本书加上网查资料(这方面的资料较少),终于把基本功能实现了。
下面开始码代码:
1、在web.xml中添加servlet
2、它对应去WEB-INF下的ssologin-servlet.xml里去查找实现的配置文件
3、这里要实现的功能是对用户的密码进行修改和找回,所以要对一个form进行操作,这里要注意的是最错误页面的处理,因为前台用的是spring的标签,所以必须按照ModelAndView的格式填充进去。
4、校验
5、service层和dao层就没必要过多的说了。只是要提下,这里持久化用的是jdbc,dao里用的是spring的getJdbcTemplate()
6、前台的jsp页面
7、总结
至此,spring的mvc功能基本实现了,给我的感觉是分得太细了,有点繁琐,大家不怎么用它,所以相关资料也比较少。虽然上面罗列的代码比较简单,但是在这做一个总结,起码以后不是从零开始了。
前段时间项目上了sso,用的是耶鲁大学的CAS,关于sso就不啰嗦太多给出一个链接,这里讲的已经很详细了http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html
这个CAS里面用的是spring的mvc,以前看spring的时候,mvc都是忽略的,因为很少用。这次用到它还真有点抓狂,所以临时抱佛脚,捧了三本书加上网查资料(这方面的资料较少),终于把基本功能实现了。
下面开始码代码:
1、在web.xml中添加servlet
<servlet>
<servlet-name>ssologin</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ssologin</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
2、它对应去WEB-INF下的ssologin-servlet.xml里去查找实现的配置文件
<bean name="modify" class="com.sso.creditnet.web.UserControler">
<property name="userservice" ref="userservice" />
<property name="sessionForm">
<value>true</value>
</property>
<property name="commandName">
<value>User</value>
</property>
<property name="commandClass">
<value>com.sso.creditnet.pojo.User</value>
</property>
<!-- 校验器 -->
<property name="validator">
<ref bean="userValidator"/>
</property>
<property name="formView"><value>modifyuser</value></property>
<property name="successView"><value>modifySuccess</value></property>
</bean>
<bean name="find" class="com.sso.creditnet.web.FindUserControler">
<!-- 注入一个userservice -->
<property name="userservice" ref="userservice" />
<property name="sessionForm">
<value>true</value>
</property>
<property name="commandName">
<value>User</value>
</property>
<property name="commandClass">
<value>com.sso.creditnet.pojo.User</value>
</property>
<property name="formView"><value>finduser</value></property>
<property name="successView"><value>modifySuccess</value></property>
</bean>
<!-- 这里使用SimpleUrlHandlerMapping 控制器映射 功能强大 支持通配符表示 -->
<!-- 所用的*.html都被DispatcherServlet拦截 -->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/modifyuser.html">modify</prop>
<prop key="/finduser.html">find</prop>
</props>
</property>
</bean>
<!-- 定义视图 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/WEB-INF/view/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
3、这里要实现的功能是对用户的密码进行修改和找回,所以要对一个form进行操作,这里要注意的是最错误页面的处理,因为前台用的是spring的标签,所以必须按照ModelAndView的格式填充进去。
public class UserControler extends SimpleFormController {
private IUserService userservice;
public void setUserservice(IUserService userservice) {
this.userservice = userservice;
}
//设置命令类
// public void doSubmitAction(Object command) {
// User user = (User) command;
// user.setUsername("root");
// /*
// * The givenData object now contains the successfully validated data
// * from the form, so can be written to a database, or whatever.
// */
// }
public ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response,Object command, BindException ex)throws Exception{
User user = (User)command;
user.setUsername("root");
if(userservice.updateUser(user)){
return new ModelAndView(this.getSuccessView());
}else{
request.setAttribute("user", "user");
return new ModelAndView(this.getFormView(),this.getCommandName(),user);
}
}
}
4、校验
public class userValidator implements Validator{
//注入正则表达式
private String exp;
private static final String EXP="[a-zA-Z0-9]{6,15}";
public void setExp(String exp) {
this.exp = exp;
}
public boolean supports(Class arg0) {
return arg0.equals(User.class);
}
public void validate(Object obj, Errors e) {
User user = (User)obj;
if(user.getPassword().equals("")){
e.rejectValue("password", "error.not-specified", null, "必须输入");
}else if(user.getPassword1().equals("")){
e.rejectValue("password1", "error.not-specified", null, "必须输入");
}else if(user.getPassword2().equals("")){
e.rejectValue("password2", "error.not-specified", null, "必须输入");
}else if(!user.getPassword1().equals(user.getPassword2())){
e.rejectValue("password2", "error.equals", null, "两次输入密码必须一致");
}else if(!Pattern.matches(EXP, user.getPassword1())){
e.rejectValue("password1", "error.invalid", null, "请输入正确格式");
}
}
public String getExp() {
return exp;
}
}
5、service层和dao层就没必要过多的说了。只是要提下,这里持久化用的是jdbc,dao里用的是spring的getJdbcTemplate()
Object[] args = {user.getPassword1(),user.getUsername()};
getJdbcTemplate().update("update user set password = ? " +
"where username = ? ", args);
6、前台的jsp页面
<html>
<head>
<title>用户密码修改</title>
</head>
<body>
<c:if test="${user!=null}">修改失败,请重新输入</c:if>
<form action="modifyuser.html" method="post">
<spring:bind path="User.password">
请填写旧密码:<input type="text" name="password" value="<c:out value="${status.value}"/>"/> <c:out value="${status.errorMessage}"/>
</spring:bind> <br>
<spring:bind path="User.password1">
请输入新密码:<input type="text" name="password1" value="<c:out value="${status.value}"/>"/> <c:out value="${status.errorMessage}"/>
</spring:bind><br>
<spring:bind path="User.password2">
重复输入新密码:
<input type="text" name="password2" value="<c:out value="${status.value}"/>"/> <c:out value="${status.errorMessage}"/>
</spring:bind><br>
<input type="submit" value="确认修改">
</form>
</body>
</html>
7、总结
至此,spring的mvc功能基本实现了,给我的感觉是分得太细了,有点繁琐,大家不怎么用它,所以相关资料也比较少。虽然上面罗列的代码比较简单,但是在这做一个总结,起码以后不是从零开始了。