调查管理系统 -(5)Struts2配置&用户注册/登录/校验

1、设计BaseAction

由于几乎每个Action都要继承ActionSupport类并且实现ModelDriven接口,因此最好设计一个BaseAction类,让其继承ActionSupport并实现ModelDriven接口,便于其它Action的复用。当然,设计BaseAction的作用不仅在于此,其还将会有很多的用处,拭目以待吧。

具体实现如下:

 1 package com.atguigu.surveypark.struts2.action;
 2 import com.opensymphony.xwork2.ActionSupport;
 3 import com.opensymphony.xwork2.ModelDriven;
 4 import com.opensymphony.xwork2.Preparable;
 5 /**
 6  * 抽象action,专门用于继承
 7  */
 8 public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>, Preparable {
 9     public void prepare() throws Exception {}
10     public abstract T getModel() ;
11 }

在这里BaseAction除了实现了ModelDriven接口以外,还实现了Preparable接口。因为实现了Preparable接口后,在拦截器栈中的prepare拦截器(即预处理拦截器)会起作用,这样就可以在Action中实现其prepare()方法或自定义以prepare或prepareDo开头加上Action中方法名的方法,在Action相应的方法调用前为我们执行一些预处理工作。

2、定义注册Action即RegAction:

在RegAction中主要定义了两个方法toRegPage()和doReg()(即到达注册页面和进行用户注册),具体实现如下:

 1 package com.atguigu.surveypark.struts2.action;
 2 import javax.annotation.Resource;
 3 import org.apache.struts2.interceptor.validation.SkipValidation;
 4 import org.springframework.context.annotation.Scope;
 5 import org.springframework.stereotype.Controller;
 6 import com.atguigu.surveypark.model.User;
 7 import com.atguigu.surveypark.service.UserService;
 8 import com.atguigu.surveypark.util.DataUtil;
 9 import com.atguigu.surveypark.util.ValidateUtil;
10 /**
11  * 注册action
12  */
13 @Controller
14 @Scope("prototype")
15 public class RegAction extends BaseAction<User> {
16     private User model = new User();
17     private String confirmPassword ; //确认密码字段
18     //注入userService
19     @Resource
20     private UserService userService ;
21     public String getConfirmPassword() {
22         return confirmPassword;
23     }
24     public void setConfirmPassword(String confirmPassword) {
25         this.confirmPassword = confirmPassword;
26     }
27     public User getModel() {
28         return model;
29     }
30     //到达注册页面
31     @SkipValidation
32     public String toRegPage(){
33         return "regPage" ;
34     }
35     //进行用户注册
36     public String doReg(){
37         //密码加密
38         model.setPassword(DataUtil.md5(model.getPassword()));
39         userService.saveEntity(model);
40         return SUCCESS ;
41     }
42     //校验
43     public void validate() {
44         //1.非空
45         if(!ValidateUtil.isValid(model.getEmail())){
46             addFieldError("email", "email是必填项!");
47         }
48         if(!ValidateUtil.isValid(model.getPassword())){
49             addFieldError("password", "password是必填项!");
50         }
51         if(!ValidateUtil.isValid(model.getNickName())){
52             addFieldError("nickName", "nickName是必填项!");
53         }
54         if(hasErrors()){
55             return ;
56         }
57         //2.密码一致性
58         if(!model.getPassword().equals(confirmPassword)){
59             addFieldError("password", "密码不一致!");
60             return  ;
61         }
62         //3.email占用
63         if(userService.isRegisted(model.getEmail())){
64             addFieldError("email", "email已占用!");
65         }
66     }
67 }

在RegAction中我们实现了BaseAction中的getModel()方法,这样ModelDriven拦截器能够将返回的模型model对象(这里即为user对象)压入到ValueStack的栈顶。

此外,在RegAction中还覆写了validate()方法对用户注册进行校验。由于validate()方法只需要在请求doReg()方法调用时进行校验,因此为toRegPage()方法添加了@SkipValidation注解,这样在调用toRegPage()方法时,Struts2的validate拦截器就不会执行validate()方法去对请求进行校验。

还注意到,在对用户输入的Email、密码等字段是否为空进行校验时,封装了一个工具类方法ValidateUtil.isValid()。由于对字符串是否为空、集合是否为空等校验工作经常会用到,因此我们可以将常用的方法抽取出来放到工具类中,以实现代码的重用。(当然我们也可以借助于其它类似于Apache提供的commons-lang.jar等工具包来完成这些基本工作。)

 3、定义登录Action即LoginAction:

在LoginAction中主要定义了两个方法toLoginPage()和doLogin()(即到达登录页面和进行登录),具体实现如下:

 1 package com.atguigu.surveypark.struts2.action;
 2 import java.util.Map;
 3 import javax.annotation.Resource;
 4 import org.apache.struts2.interceptor.SessionAware;
 5 import org.springframework.context.annotation.Scope;
 6 import org.springframework.stereotype.Controller;
 7 import com.atguigu.surveypark.model.User;
 8 import com.atguigu.surveypark.service.UserService;
 9 import com.atguigu.surveypark.util.DataUtil;
10 /**
11  * 登陆action
12  */
13 @Controller
14 @Scope("prototype")
15 public class LoginAction extends BaseAction<User> implements SessionAware {
16     @Resource
17     private UserService userService ;
18     //接受session的map
19     private Map<String,Object> sessionMap ;
20     //到达登陆页面
21     public String toLoginPage(){
22         return "loginPage" ;
23     }
24     //进行登陆处理
25     public String doLogin(){
26         return "success";
27     }
28     //校验登陆信息
29     public void validateDoLogin(){
30         User user = userService.validateLoginInfo(model.getEmail(),DataUtil.md5(model.getPassword()));
31         if(user == null){
32             addActionError("email/password错误");
33         }
34         else{
35             sessionMap.put("user", user);
36         }
37     }
38     //注入session的map
39     public void setSession(Map<String, Object> arg0) {
40         this.sessionMap = arg0 ;
41     }
42 }

在LoginAction中我们实现了SessionAware接口,并在Action中声明了一个sessionMap变量,这样在请求Action方法时servletConfig拦截器就会为Action注入session的Map对象。(我认为这里也可以使用ActionContext来获取session,因为无论哪种方法都会是我们的代码与Struts2框架有一定的耦合。另外,佟刚老师曾讲过对于使用ActionContext或实现XxxAware接口的建议是:若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用Aware接口的方式。这里也只有doLogin()方法用到了sessionMap。)

此外,在LoginAction中也需要对用户登录进行校验(只需对doLogin()方法的调用进行校验),在这里定义的是一个validateDoLogin()方法,而并没有在toLoginPage()方法上添加@SkipValidation注解。这时因为,Struts2的验证框架为我们提供了另外一种过滤需要校验的方法的手段,即我们只需要为需要校验的方法编写一个以validate或validateDo开头并加上需要校验的方法的方法名的方法即可(如这里需要对doLogin()方法进行校验,我们只需定义一个validateDoLogin()方法或validateDoDoLogin()方法,这样Struts2就只是在请求doLogin()方法时进行校验,而不会对其它方法的调用进行校验。)。

还有重要的一点是,在LoginAction方法中并没有实现BaseAction的getModel()方法。这时由于在每个Action中都需要获取model对象,因此,我们利用反射技术对BaseAction进行改造,将model对象的实例化工作放到BaseAction的构造方法中来完成,这样在实例化具体的Action时,其构造方法在调用父类BaseAction的构造方法时会完成model的实例化工作,这样同样提供了代码的重用性。改造后的BaseAction的实现如下:

 1 package com.atguigu.surveypark.struts2.action;
 2 import java.lang.reflect.ParameterizedType;
 3 import com.opensymphony.xwork2.ActionSupport;
 4 import com.opensymphony.xwork2.ModelDriven;
 5 import com.opensymphony.xwork2.Preparable;
 6 /**
 7  * 抽象action,专门用于继承
 8  */
 9 public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>, Preparable {
10     public T model ;
11     public BaseAction(){
12         try {
13             ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
14             Class clazz = (Class) type.getActualTypeArguments()[0];
15             model = (T) clazz.newInstance();
16         } catch (Exception e) {
17             e.printStackTrace();
18         }
19     }
20     public void prepare() throws Exception {    }
21     public T getModel(){
22         return model ;
23     }
24 }

这里的工作类似于BaseDaoImpl与BaseServiceImpl,主要都是获取到泛型的具体类型,然后对其进行实例化操作。

同时,BaseAction、BaseDaoImpl、BaseServiceImpl我们都定义为了一个抽象类,关于将基类定义为抽象类的好处参:不是抽象类的基类不是好基类

4、推荐做法及知识点:

1)推荐做法:不要直接与JSP页面进行交互,而要让每个请求都经过Action,这样便于权限或安全问题的控制。

2) Spring的自动检测注解@Controller、@Service、@Repository本质上并没有什么区别,只是从语义(字面)上来区分了每个对象属于哪一层。

3)SSH整合后,Action类是由Spring负责创建的,但是其生命周期并不由Spring管理。因为Spring容器只管理单例的bean,而不管理原型的bean(Action是原型的bean)。

5、总结:

1)Struts2框架提供给了两种过滤校验的方法:

Ⅰ、在不要进行校验的方法上添加@SkipValidation注解;

Ⅱ、为需要校验的方法编写特定的的方法,该方法必须以validate或validateDo开头,后面加上需要校验的方法的名称(首字母要大写)。

2)文中红色字体部分。

时间: 2024-08-22 05:23:06

调查管理系统 -(5)Struts2配置&用户注册/登录/校验的相关文章

【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB引用的空指针异常,造成数据错误,程序崩溃.因此需要一种机制保障每次发送请求执行Action中的方法之前校验用户是否处于登录状态.针对上述分析,可以选用两种实现方式.AOPAOP思想可以在任意方法执行前进行拦截,完成原始方法执行前的操作Struts2拦截器Struts2拦截器可以再Struts2的任意

银行管理系统 实现用户注册 登录 存、取款 交易记录查询和修改用户信息等功能

========= 项    目   介   绍======== 银行账户管理系统 本项目主要实现用户注册 登录 存.取钱和修改用户信息功能. 用户信息的存储和获取通过集合和IO输入输出流实现. 存钱 取钱功能通过修改用户信息中的余额实现 修改用户信息 要先获取用户信息 ,再把修改后的信息保存到List中,同时必须删除原有的用户信息. ========项目功能需求============= 该银行管理系统可以实现 以下主要几个功能 用户注册   注册成功才能进行用户登录 用户登录  登录成功后

基于xml的用户注册登录案例

用户注册登录 要求:3层框架,使用验证码 1        功能分析 l  注册 l  登录 1.1 JSP页面 l  regist.jsp 注册表单:用户输入注册信息: 回显错误信息:当注册失败时,显示错误信息: l  login.jsp 登录表单:用户输入登录信息: 回显错误信息:当登录失败时,显示错误信息: l  index.jsp 用户已登录:显示当前用户名,以及"退出"链接: 用户未登录:显示"您还没有登录": 1.2 实体类 User: l  Strin

调查管理系统 -(7)设计调查选项处理&amp;Answer实体的分析设计&amp;开发的经验技巧&amp;数据库使用等

1.设计调查选项处理-巧利用Hibernate为对象赋值的时机 1)在Hibernate映射文件的<set>元素中添加order-by属性指定集合元素的排序方式. 2)由于问题的选项在数据库中是以字符串(选项之间以“\r\n”分隔)的形式保存的,因此,在页面上进行问题选项显示前要对字符串进行拆分工作.该字符串拆分的执行时机应该是什么时候比较好?(视频16:调查管理系统_设计调查选项处理)  技巧:Hibernate从DB中查询出数据并映射为对象,在为对象进行赋值时是调用对象成员变量的sette

Asp.Net Core 项目实战之权限管理系统(5) 用户登录

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL 4 Asp.Net Core 项目实战之权限管理系统(4) 依赖注入.仓储.服务的多项目分层实现 5 Asp.Net Core 项目实

struts2 学习(七) ----- 输入校验

struts2输入校验(服务器端验证) 一.使用validate方法进行输入校验 步骤:1) 重写Action的validate()函数 2) 在struts2.xml中配置Action的别名为"input"的result 3) 在输出页面上显示错误:使用<s:fielderror>标签 1. 新建LoginAction.java的时候要继承ActionSupport类: 2. 配置: 3.使用<s:fielderror>标签 二.使用struts2校验框架实现

Lumen实现用户注册登录认证

Lumen实现用户注册登录认证 前言 Lumen是一个基于Laravel的微框架,号称是以速度为生.截用Lumen官网的一段,号称是比silex和slim还要快. 本文将用Lumen来实现一个完整的用户注册.登录及获取用户信息的API. Lumen官方网站:https://lumen.laravel.com/Lumen中文网站:http://lumen.laravel-china.org/ 安装 composer create-project --prefer-dist laravel/lume

java web: eclipse &amp; maven &amp; jetty &amp; struts2 &amp; mysql = 简单登录页面

第一次接触java web开发,花费了一天半的时间,写了个简单的登录页面,以此文为记. 开发工具 Eclipse Luna Release (4.4.0) 已集成maven,maven目前的体会就是管理各种依赖 jetty为maven提供的一个插件,类似tomcat struts2框架,MVC,action,jsp mysql server 5.6 开发过程 1. 新建Maven web工程 Group Id: org.apache.maven.archetypes Artifact Id: m

超全面的JavaWeb笔记day14&lt;用户注册登录&gt;

案例:用户注册登录 要求:3层框架,使用验证码 1 功能分析 l 注册 l 登录 1.1 JSP页面 l regist.jsp ? 注册表单:用户输入注册信息: ? 回显错误信息:当注册失败时,显示错误信息: l login.jsp ? 登录表单:用户输入登录信息: ? 回显错误便利店:当登录失败时,显示错误信息: l index.jsp ? 用户已登录:显示当前用户名,以及"退出"链接: ? 用户未登录:显示"您还没有登录": 1.2 实体类 User: l St