- 浏览: 28539 次
- 性别:
- 来自: 北京
最新评论
Struts1框架
1.1、框架(Framework)和Struts
框架的概念:就是为项目定义一个开发的规则,项目中加入一些封装好的支持包,以及配置文件,所有开发人员都按照该框架规定的格式来进行代码的编写。
Struts框架是apache开发的一个开源的框架,版本目前出现的有两大版本:1.x(1.0 – 1.3),2.x(收购WebWork,最新版2.1.16,稳定版本:2.0.8,2.1.8),两个版本的架构完全不一样,理论上未来发展方向应该是2.x。
Struts框架是实现MVC模式的一个框架。Model层之前使用JavaBean + DAO,Controller之前使用Servlet,View层之前使用JSP + JSTL + EL
使用Struts后,Model层不变,Controller层改为Struts提供的ActionForm和Action来实现,两者合并到一起实现之前Servlet的功能,View层改为JSP + Struts标签库 + EL
其他框架:
MVC框架:Struts1/2,WebWork,JSF(Java Server Faces)、ORM框架:Hibernate,iBATIS,EJB、中间件框架:Spring,Seasar、WebService框架:XFire(CXF)、搜索引擎:Lucene、工作流框架:JBPM
AJAX框架:JQuery,JSON,DWR,ExtJS
不使用Struts时,登陆怎样编写:
DAO部分 登陆页面 提交表单 在web.xml中找到Servlet 进入doGet/doPost 接收参数,验证,整合,依据返回结果设置属性,跳转 成功页或错误页
改用Struts后,模式改为:
DAO部分 登陆页面(Struts标签) 提交表单 在web.xml中找到Servlet(Struts提供一个专用的Servlet,名称为ActionServlet) 由ActionServlet自动完成执行Struts的ActionForm和Action 执行ActionForm(接收参数,并验证) 进入Action,调用DAO,依据结果设置属性,跳转 成功页或错误页
1.2、Struts完成登陆
建立项目,并为项目加入Struts框架支持。注意,Struts版本必须为1.2或1.3
而且加入支持后,必须自动部署项目,如果想手工修改server.xml部署,必须先将所有的struts支持包拷贝到项目的lib目录下。加入支持后,在web.xml中可以修改struts-config.xml核心文件的文件名,或配置多个核心文件
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
开始编写代码。DAO部分省略,简化为写死的判断,当用户输入用户名wuzhlin,密码12345时表示登陆成功,否则登陆失败。编写登陆页。建立新的jsp,建立包含了Struts1.2/1.3支持的jsp
<center>
<html:form action="/login.do" method="post">
用户ID:<html:text property="userid"></html:text> <br/>
密码:<html:password property="password"></html:password> <br/>
<html:submit>登陆</html:submit>
<html:reset>重置</html:reset>
</html:form>
</center>
使用Struts标签来完成表单,使用方法与普通表单类似。
但提交路径可以直接写 /路径, 而不需要加入${pageContext.request.contextPath}
不再使用name作为提交的参数名,改为property。使用这种标签后,可以完成自动回填功能。
建立ActionForm与Action,将use case中填入提交路径中的名称(提交路径名为login.do,因此这里直接填写login),注意,修改Input Source,改为验证出错后自动跳转
建立好ActionForm与Action后,先编写ActionForm
接收参数,直接在ActonForm中定义属性,并生成getter与setter方法即可自动接收参数。
private String userid;
private String password;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
加入验证功能,这里验证用户名和密码不能为空。
验证通过validate方法来完成。在验证时,错误信息需要在资源文件中提前定义好
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// 保存所有错误信息的一个对象
ActionErrors errors = new ActionErrors();
// 判断用户名与密码是否为空
if (this.userid == null || this.userid.trim().equals("")) {
// 添加错误信息,错误信息需要依据名称去资源文件中取得对应的值,并保存到errors对象里
errors.add("userid", new ActionMessage("userid.null"));
}
if (this.password == null || this.password.trim().equals("")) {
errors.add("password", new ActionMessage("password.null"));
}
return errors;
}
如果验证出错,会自动跳转回错误页。
在错误页中(login.jsp中)加入错误信息显示的功能。通过<html:errors/>标签来显示错误信息。
<center>
<font color="red">
<html:errors/>
</font>
<html:form action="/login.do" method="post">
用户ID:<html:text property="userid"></html:text> <html:errors property="userid"/> <br/>
密码:<html:password property="password"></html:password> <html:errors property="password"/> <br/>
<html:submit>登陆</html:submit>
<html:reset>重置</html:reset>
</html:form>
</center>
没有加入property表示显示所有错误信息,加入property表示显示某一个名称的错误信息。编写Action。
/**
* 该方法相当于之前的doGet + doPost
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
// 执行验证登陆,如果写了DAO,这里就需要调用数据库操作
if (loginForm.getUserid().equals("wuzhulin")
&& loginForm.getPassword().equals("12345")) {
// 登陆成功
request.getSession().setAttribute("userid", loginForm.getUserid());
// 跳转到成功页
return mapping.findForward("suc");
} else {
// 提示错误信息
ActionErrors errors = new ActionErrors();
errors.add("login", new ActionMessage("login.err"));
// 保存错误信息
this.addErrors(request, errors);
// 返回错误页
return mapping.getInputForward();
}
}
打开 struts-config.xml,配置suc跳转路径。
<action attribute="loginForm" input="/login.jsp" name="loginForm"
path="/login" scope="request" type="cn.mldn.login.struts.action.LoginAction"
cancellable="true">
<forward name="suc" path="/suc.jsp"></forward>
</action>
Name表示路径名称,在Action中返回时会用到,path表示要跳转的具体路径。
要设置密码不回填,可以在Action中跳转错误页前,将密码设置为空值
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
// 执行验证登陆,如果写了DAO,这里就需要调用数据库操作
if (loginForm.getUserid().equals("wuzhulin")
&& loginForm.getPassword().equals("12345")) {
// 登陆成功
request.getSession().setAttribute("userid", loginForm.getUserid());
// 跳转到成功页
return mapping.findForward("suc");
} else {
// 提示错误信息
ActionErrors errors = new ActionErrors();
errors.add("login", new ActionMessage("login.err"));
// 保存错误信息
this.addErrors(request, errors);
// 设置密码为空,不回填
loginForm.setPassword(null);
// 返回错误页
return mapping.getInputForward();
}
}
说明回填功能是靠ActionForm中属性值来完成的。也就说明了ActionForm以及里面的属性被保存在了request范围。
1.3、Struts工作原理以及核心配置文件
从jsp提交路径(*.do)在web.xml中查找到ActionServlet,ActionServlet加载了struts-config.xml,创建出了ActionForm以及Action,先执行ActionForm,接收参数,并调用validate()方法验证,如果验证失败,返回错误页,并提示错误信息(通过input找到,错误信息使用html:errors),验证成功则进入Action的execute方法,执行操作,最后跳转到jsp(依据struts-config.xml里的<forward>配置)
Struts-config.xml配置文件的说明:
form-beans:配置ActionForm的
form-bean:配置一个ActionForm
name:表示这个ActionForm的唯一标识不能重复。
type:表示ActionForm的包.类名称。
global-exceptions:配置全局异常,当出现异常时,可以依据这个配置自动跳转到错误页。
global-forwards:配置全局跳转路径,可以配置所有Action共用的跳转路径。forward中间页一般配置到这里。
action-mappings:配置所有Action的
action:配置一个Action
type:Action的包.类名称
name:表示此Action对应的ActionForm的名称,一个Action最多只允许对应一个ActionForm,但一个Form可以对应多个Action。
input:表示错误页
path:进入此Action 的虚拟路径。是Action的唯一标识
scope:表示ActionForm保存的属性范围。只能选择request或session,建议使用request
attribute:表示ActionForm在request范围内的属性名称,一般不需要修改。
<forward>:表示一个跳转路径
name:路径名
path:路径的具体地址
redirect:设置跳转的方式,如果为true表示客户端跳转,默认为false(服务器端跳转)
message-resources:配置资源文件的文件名和所在位置。
完成Elearning的登陆功能,注意MD5加密,验证码(都在ActionForm中处理)
1.4、Struts中ActionForm的参数处理
Struts支持直接将参数设置到vo对象的属性中。在ActionForm中定义出这个vo对象。
private Admin admin = new Admin();
public Admin getAdmin() {
return admin;
}
public void setAdmin(Admin admin) {
this.admin = admin;
}
修改验证方法中的代码,都改为从admin对象中取得属性
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (admin.getId() == null || admin.getId().trim().equals("")) {
// 表示向资源文件中传入一个参数,替换{1}
errors.add("id", new ActionMessage("msg.null","用户名"));
}
if (admin.getPassword() == null || admin.getPassword().trim().equals("")) {
errors.add("pwd", new ActionMessage("msg.null","密码"));
}
if (code == null || code.trim().equals("")) {
errors.add("code", new ActionMessage("msg.null","验证码"));
}
// 验证验证码是否正确
// 取得真实的验证码
String realCode = (String) request.getSession().getAttribute("rand");
if (!realCode.equals(code)) {
errors.add("code", new ActionMessage("code.err"));
}
// 还要进行MD5加密
if (errors.size() == 0) {
admin.setPassword(new MD5Code().getMD5ofStr(admin.getPassword()));
}
return errors;
}
修改Action的代码,也直接使用Form中定义好的admin对象
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
Map map = BackServiceFactory.getAdminSeviceInstance().isLogin(loginForm.getAdmin());
boolean flag = (Boolean) map.get("flag");
if (flag) {
request.getSession().setAttribute("admin", map.get("admin"));
request.getSession().setAttribute("allActions",
map.get("allActions"));
return mapping.findForward("backindex");
} else {
ActionErrors errors = new ActionErrors();
errors.add("login", new ActionMessage("login.err"));
this.addErrors(request, errors);
loginForm.getAdmin().setPassword(null);
return mapping.getInputForward();
}
}
修改jsp页面,将表单中提交的文本框的名称改为对象中属性的形式
<tr>
<td align="center" valign="middle">管理员ID:
<html:text property="admin.id" styleClass="fm_blue" size="25" /><br><span id="user"></span></td>
</tr>
<tr>
<td align="center" valign="middle">密 码:
<html:password property="admin.password" styleClass="fm_blue" size="25"/></td>
</tr>
可以直接设置属性,在完成添加或修改功能时,一般会使用到这种设置参数的形式。
对于不是String类型的参数,ActionForm在一定程度上也可以处理。
定义一个User的vo类,在里面加入age和birthday,分别为int基本数据类型和Date日期类型。
package org.wu.login.vo;
import java.util.Date;
public class User {
private String userid ;
private String password ;
private int age ;
private Date birthday;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
在页面上直接将数据提交到vo对象中
<center>
<font color="red">
<html:errors/>
</font>
<html:form action="/regist.do" method="post">
用户ID:<html:text property="user.userid"></html:text> <br/>
密码:<html:password property="user.password"></html:password><br/>
年龄:<html:text property="user.age"></html:text><br/>
生日:<html:text property="user.birthday"></html:text><br/>
<html:submit>登陆</html:submit>
<html:reset>重置</html:reset>
</html:form>
</center>
建立Action与ActionForm
package org.wu.login.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.wu.login.vo.User;
public class RegistForm extends ActionForm {
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (user.getUserid() == null || user.getUserid().trim().equals("")) {
errors.add("userid", new ActionMessage("userid.null"));
}
System.out.println(user.getAge());
System.out.println(user.getBirthday());
return errors;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
}
}
测试后发现,Date类型是不能自动接收的。对于Date类型必须先使用String类型的属性接收,接收后,在validate方法中通过SimpleDateFormat来转型
生日:<html:text property="birthday"></html:text><br/>
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (user.getUserid() == null || user.getUserid().trim().equals("")) {
errors.add("userid", new ActionMessage("userid.null"));
}
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
user.setBirthday(sf.parse(this.birthday));
} catch (Exception e) {
errors.add("birthday", new ActionMessage("birth.err"));
}
System.out.println(this.user.getAge());
System.out.println(this.user.getBirthday());
return errors;
}
基本数据类型的数据可以自动转型。如果输入的语法正确,可以转型,则自动会进行转换。
如果输入的语法错误,无法转型,直接将该类型的默认值设置到这个对应的属性中。
基本类型中boolean类型比较特殊,也可以自动转型,但只支持以下的值:true,false,0,1
在ActionForm中,也可以自动接收多选框的数组类型数据。
1.1、框架(Framework)和Struts
框架的概念:就是为项目定义一个开发的规则,项目中加入一些封装好的支持包,以及配置文件,所有开发人员都按照该框架规定的格式来进行代码的编写。
Struts框架是apache开发的一个开源的框架,版本目前出现的有两大版本:1.x(1.0 – 1.3),2.x(收购WebWork,最新版2.1.16,稳定版本:2.0.8,2.1.8),两个版本的架构完全不一样,理论上未来发展方向应该是2.x。
Struts框架是实现MVC模式的一个框架。Model层之前使用JavaBean + DAO,Controller之前使用Servlet,View层之前使用JSP + JSTL + EL
使用Struts后,Model层不变,Controller层改为Struts提供的ActionForm和Action来实现,两者合并到一起实现之前Servlet的功能,View层改为JSP + Struts标签库 + EL
其他框架:
MVC框架:Struts1/2,WebWork,JSF(Java Server Faces)、ORM框架:Hibernate,iBATIS,EJB、中间件框架:Spring,Seasar、WebService框架:XFire(CXF)、搜索引擎:Lucene、工作流框架:JBPM
AJAX框架:JQuery,JSON,DWR,ExtJS
不使用Struts时,登陆怎样编写:
DAO部分 登陆页面 提交表单 在web.xml中找到Servlet 进入doGet/doPost 接收参数,验证,整合,依据返回结果设置属性,跳转 成功页或错误页
改用Struts后,模式改为:
DAO部分 登陆页面(Struts标签) 提交表单 在web.xml中找到Servlet(Struts提供一个专用的Servlet,名称为ActionServlet) 由ActionServlet自动完成执行Struts的ActionForm和Action 执行ActionForm(接收参数,并验证) 进入Action,调用DAO,依据结果设置属性,跳转 成功页或错误页
1.2、Struts完成登陆
建立项目,并为项目加入Struts框架支持。注意,Struts版本必须为1.2或1.3
而且加入支持后,必须自动部署项目,如果想手工修改server.xml部署,必须先将所有的struts支持包拷贝到项目的lib目录下。加入支持后,在web.xml中可以修改struts-config.xml核心文件的文件名,或配置多个核心文件
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
开始编写代码。DAO部分省略,简化为写死的判断,当用户输入用户名wuzhlin,密码12345时表示登陆成功,否则登陆失败。编写登陆页。建立新的jsp,建立包含了Struts1.2/1.3支持的jsp
<center>
<html:form action="/login.do" method="post">
用户ID:<html:text property="userid"></html:text> <br/>
密码:<html:password property="password"></html:password> <br/>
<html:submit>登陆</html:submit>
<html:reset>重置</html:reset>
</html:form>
</center>
使用Struts标签来完成表单,使用方法与普通表单类似。
但提交路径可以直接写 /路径, 而不需要加入${pageContext.request.contextPath}
不再使用name作为提交的参数名,改为property。使用这种标签后,可以完成自动回填功能。
建立ActionForm与Action,将use case中填入提交路径中的名称(提交路径名为login.do,因此这里直接填写login),注意,修改Input Source,改为验证出错后自动跳转
建立好ActionForm与Action后,先编写ActionForm
接收参数,直接在ActonForm中定义属性,并生成getter与setter方法即可自动接收参数。
private String userid;
private String password;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
加入验证功能,这里验证用户名和密码不能为空。
验证通过validate方法来完成。在验证时,错误信息需要在资源文件中提前定义好
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// 保存所有错误信息的一个对象
ActionErrors errors = new ActionErrors();
// 判断用户名与密码是否为空
if (this.userid == null || this.userid.trim().equals("")) {
// 添加错误信息,错误信息需要依据名称去资源文件中取得对应的值,并保存到errors对象里
errors.add("userid", new ActionMessage("userid.null"));
}
if (this.password == null || this.password.trim().equals("")) {
errors.add("password", new ActionMessage("password.null"));
}
return errors;
}
如果验证出错,会自动跳转回错误页。
在错误页中(login.jsp中)加入错误信息显示的功能。通过<html:errors/>标签来显示错误信息。
<center>
<font color="red">
<html:errors/>
</font>
<html:form action="/login.do" method="post">
用户ID:<html:text property="userid"></html:text> <html:errors property="userid"/> <br/>
密码:<html:password property="password"></html:password> <html:errors property="password"/> <br/>
<html:submit>登陆</html:submit>
<html:reset>重置</html:reset>
</html:form>
</center>
没有加入property表示显示所有错误信息,加入property表示显示某一个名称的错误信息。编写Action。
/**
* 该方法相当于之前的doGet + doPost
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
// 执行验证登陆,如果写了DAO,这里就需要调用数据库操作
if (loginForm.getUserid().equals("wuzhulin")
&& loginForm.getPassword().equals("12345")) {
// 登陆成功
request.getSession().setAttribute("userid", loginForm.getUserid());
// 跳转到成功页
return mapping.findForward("suc");
} else {
// 提示错误信息
ActionErrors errors = new ActionErrors();
errors.add("login", new ActionMessage("login.err"));
// 保存错误信息
this.addErrors(request, errors);
// 返回错误页
return mapping.getInputForward();
}
}
打开 struts-config.xml,配置suc跳转路径。
<action attribute="loginForm" input="/login.jsp" name="loginForm"
path="/login" scope="request" type="cn.mldn.login.struts.action.LoginAction"
cancellable="true">
<forward name="suc" path="/suc.jsp"></forward>
</action>
Name表示路径名称,在Action中返回时会用到,path表示要跳转的具体路径。
要设置密码不回填,可以在Action中跳转错误页前,将密码设置为空值
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
// 执行验证登陆,如果写了DAO,这里就需要调用数据库操作
if (loginForm.getUserid().equals("wuzhulin")
&& loginForm.getPassword().equals("12345")) {
// 登陆成功
request.getSession().setAttribute("userid", loginForm.getUserid());
// 跳转到成功页
return mapping.findForward("suc");
} else {
// 提示错误信息
ActionErrors errors = new ActionErrors();
errors.add("login", new ActionMessage("login.err"));
// 保存错误信息
this.addErrors(request, errors);
// 设置密码为空,不回填
loginForm.setPassword(null);
// 返回错误页
return mapping.getInputForward();
}
}
说明回填功能是靠ActionForm中属性值来完成的。也就说明了ActionForm以及里面的属性被保存在了request范围。
1.3、Struts工作原理以及核心配置文件
从jsp提交路径(*.do)在web.xml中查找到ActionServlet,ActionServlet加载了struts-config.xml,创建出了ActionForm以及Action,先执行ActionForm,接收参数,并调用validate()方法验证,如果验证失败,返回错误页,并提示错误信息(通过input找到,错误信息使用html:errors),验证成功则进入Action的execute方法,执行操作,最后跳转到jsp(依据struts-config.xml里的<forward>配置)
Struts-config.xml配置文件的说明:
form-beans:配置ActionForm的
form-bean:配置一个ActionForm
name:表示这个ActionForm的唯一标识不能重复。
type:表示ActionForm的包.类名称。
global-exceptions:配置全局异常,当出现异常时,可以依据这个配置自动跳转到错误页。
global-forwards:配置全局跳转路径,可以配置所有Action共用的跳转路径。forward中间页一般配置到这里。
action-mappings:配置所有Action的
action:配置一个Action
type:Action的包.类名称
name:表示此Action对应的ActionForm的名称,一个Action最多只允许对应一个ActionForm,但一个Form可以对应多个Action。
input:表示错误页
path:进入此Action 的虚拟路径。是Action的唯一标识
scope:表示ActionForm保存的属性范围。只能选择request或session,建议使用request
attribute:表示ActionForm在request范围内的属性名称,一般不需要修改。
<forward>:表示一个跳转路径
name:路径名
path:路径的具体地址
redirect:设置跳转的方式,如果为true表示客户端跳转,默认为false(服务器端跳转)
message-resources:配置资源文件的文件名和所在位置。
完成Elearning的登陆功能,注意MD5加密,验证码(都在ActionForm中处理)
1.4、Struts中ActionForm的参数处理
Struts支持直接将参数设置到vo对象的属性中。在ActionForm中定义出这个vo对象。
private Admin admin = new Admin();
public Admin getAdmin() {
return admin;
}
public void setAdmin(Admin admin) {
this.admin = admin;
}
修改验证方法中的代码,都改为从admin对象中取得属性
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (admin.getId() == null || admin.getId().trim().equals("")) {
// 表示向资源文件中传入一个参数,替换{1}
errors.add("id", new ActionMessage("msg.null","用户名"));
}
if (admin.getPassword() == null || admin.getPassword().trim().equals("")) {
errors.add("pwd", new ActionMessage("msg.null","密码"));
}
if (code == null || code.trim().equals("")) {
errors.add("code", new ActionMessage("msg.null","验证码"));
}
// 验证验证码是否正确
// 取得真实的验证码
String realCode = (String) request.getSession().getAttribute("rand");
if (!realCode.equals(code)) {
errors.add("code", new ActionMessage("code.err"));
}
// 还要进行MD5加密
if (errors.size() == 0) {
admin.setPassword(new MD5Code().getMD5ofStr(admin.getPassword()));
}
return errors;
}
修改Action的代码,也直接使用Form中定义好的admin对象
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
Map map = BackServiceFactory.getAdminSeviceInstance().isLogin(loginForm.getAdmin());
boolean flag = (Boolean) map.get("flag");
if (flag) {
request.getSession().setAttribute("admin", map.get("admin"));
request.getSession().setAttribute("allActions",
map.get("allActions"));
return mapping.findForward("backindex");
} else {
ActionErrors errors = new ActionErrors();
errors.add("login", new ActionMessage("login.err"));
this.addErrors(request, errors);
loginForm.getAdmin().setPassword(null);
return mapping.getInputForward();
}
}
修改jsp页面,将表单中提交的文本框的名称改为对象中属性的形式
<tr>
<td align="center" valign="middle">管理员ID:
<html:text property="admin.id" styleClass="fm_blue" size="25" /><br><span id="user"></span></td>
</tr>
<tr>
<td align="center" valign="middle">密 码:
<html:password property="admin.password" styleClass="fm_blue" size="25"/></td>
</tr>
可以直接设置属性,在完成添加或修改功能时,一般会使用到这种设置参数的形式。
对于不是String类型的参数,ActionForm在一定程度上也可以处理。
定义一个User的vo类,在里面加入age和birthday,分别为int基本数据类型和Date日期类型。
package org.wu.login.vo;
import java.util.Date;
public class User {
private String userid ;
private String password ;
private int age ;
private Date birthday;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
在页面上直接将数据提交到vo对象中
<center>
<font color="red">
<html:errors/>
</font>
<html:form action="/regist.do" method="post">
用户ID:<html:text property="user.userid"></html:text> <br/>
密码:<html:password property="user.password"></html:password><br/>
年龄:<html:text property="user.age"></html:text><br/>
生日:<html:text property="user.birthday"></html:text><br/>
<html:submit>登陆</html:submit>
<html:reset>重置</html:reset>
</html:form>
</center>
建立Action与ActionForm
package org.wu.login.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.wu.login.vo.User;
public class RegistForm extends ActionForm {
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (user.getUserid() == null || user.getUserid().trim().equals("")) {
errors.add("userid", new ActionMessage("userid.null"));
}
System.out.println(user.getAge());
System.out.println(user.getBirthday());
return errors;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
}
}
测试后发现,Date类型是不能自动接收的。对于Date类型必须先使用String类型的属性接收,接收后,在validate方法中通过SimpleDateFormat来转型
生日:<html:text property="birthday"></html:text><br/>
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (user.getUserid() == null || user.getUserid().trim().equals("")) {
errors.add("userid", new ActionMessage("userid.null"));
}
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
user.setBirthday(sf.parse(this.birthday));
} catch (Exception e) {
errors.add("birthday", new ActionMessage("birth.err"));
}
System.out.println(this.user.getAge());
System.out.println(this.user.getBirthday());
return errors;
}
基本数据类型的数据可以自动转型。如果输入的语法正确,可以转型,则自动会进行转换。
如果输入的语法错误,无法转型,直接将该类型的默认值设置到这个对应的属性中。
基本类型中boolean类型比较特殊,也可以自动转型,但只支持以下的值:true,false,0,1
在ActionForm中,也可以自动接收多选框的数组类型数据。
发表评论
文章已被作者锁定,不允许评论。
相关推荐
通过以上对Struts1基础知识的讲解,我们可以看出,它在Java Web开发中起到了关键作用,为开发者提供了强大的工具来构建可维护的、结构化的应用程序。尽管现在有许多更新的框架,如Spring MVC,Struts1仍然是学习MVC...
该项目为一个基于Java语言的Struts1基础框架设计,源码解析详尽,包含88个文件,其中包括32个Java源文件、21个XML配置文件、11个JSP页面文件、4个属性文件以及少量其他类型文件。该框架适用于学习和研究Struts1框架...
Struts1入门的基础案例,使用使用Struts框架实现一个加法器的功能
#### 一、Struts1 基础与架构 **1.1 J2EE技术栈** Struts1框架是基于Java2平台企业版(J2EE)构建的,它依赖于以下技术: - **Servlet**:处理HTTP请求的基础接口,用于创建Web应用中的控制器部分。 - **JSP ...
这个“Struts基础合集”包含了慧桥公司的Struts教程、入门指南以及相关的中文文档,是学习和理解Struts1基础知识的重要资源。 1. **Struts框架简介** Struts1 是最早的Java Web MVC框架之一,它通过简化控制器层的...
1. **Struts1基础**: - **Action类**:是Struts1的核心,用于接收用户请求并执行业务逻辑。每个Action类对应一个表单提交或者URL请求。 - **配置文件(struts-config.xml)**:定义了Action类、ActionForm、转发...
本压缩包包含的是开发Struts应用程序所必需的基础组件,这些组件通常以jar包的形式提供。 1. **MVC设计模式**:MVC模式将应用分为模型(Model)、视图(View)和控制器(Controller)三个部分。模型负责处理数据和...
它在早期的Struts1基础上进行了大量的改进和增强,引入了更多的功能和灵活性。 Struts2框架的关键特性包括: 1. **Action和Result**:Struts2的核心是Action类,它是处理用户请求的业务逻辑组件。每个Action对应一...
Struts1是一个经典的Java Web开发框架,由Apache软件基金会维护,它基于Model-View-Controller(MVC)...虽然Struts1已经被更现代的框架如Spring MVC取代,但其设计理念和MVC模式依然在现代Web开发中发挥着基础作用。
1. **MVC模式**:Struts2遵循MVC架构,将业务逻辑、数据和用户界面分离,使得代码更易于维护和扩展。模型负责处理业务逻辑,视图负责展示数据,控制器则协调模型和视图之间的交互。 2. **Action类**:在Struts2中,...
首先,Struts2是一个基于MVC设计模式的开源框架,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。在Struts2中,Action类是业务逻辑的主要载体,而视图通常由JSP或FreeMarker等模板技术实现。控制器则...
它在原有的Struts1基础上进行了很多改进,引入了更多现代化的开发理念和技术,如依赖注入(DI)、面向切面编程(AOP)以及插件架构等。这个"Struts2小demo"是一个基础的学习资源,旨在帮助开发者开启SSH(Spring、...
Struts 2整合Struts 1,允许开发者利用Struts 1已有的投资,同时享受Struts 2带来的优势,如增强的类型安全和更强大的拦截器机制。 在《Struts 2权威指南--基于WebWork核心的MVC开发》这本书中,作者李纲深入浅出地...
它在原有的Struts1基础上进行了大量的改进和优化,引入了更多现代Web开发的需求和最佳实践。Struts2的核心是Action,Controller和View的MVC设计模式,这使得它能够有效地解耦业务逻辑和展示层。 在开始Struts2的...
它在原有的Struts1基础上进行了重大改进,引入了更多现代Web开发的最佳实践。2.3.20是Struts2的一个稳定版本,包含了该框架的核心组件和其他依赖库。 **Struts2框架核心组件:** 1. **Action类**:它是业务逻辑...
Struts2框架整合了Struts1和WebWork的优势,提供了一个强大的请求处理机制。在Struts2中,Action是业务逻辑的执行者,它接收并处理用户的请求,然后返回结果给用户。FilterDispatcher是Struts2的前端控制器,它负责...
Struts2是在Webwork的基础上构建的,与它的前辈Struts1.x相比,虽然在大版本号上相同,但在配置和使用上有显著区别。 在开始之前,确保你有以下环境: 1. 开发工具:MyEclipse6 2. Web服务器:Tomcat6 3. Struts2...
Struts1 是早期的 MVC 框架,而 Struts2 则是在 WebWork 框架的基础上发展起来的,它吸收了 Struts1 和 WebWork 的优点,提供了一个更强大、更灵活的解决方案。 1. **Action 类的设计**: - 在 Struts1 中,Action...
本教程旨在为初学者提供一个全面的Struts1入门指南,通过学习,你可以了解并掌握如何使用Struts1开发Java Web应用,为进一步深入其他框架如Spring MVC或Struts2奠定基础。在实践过程中,不断探索和优化,将使你成为...
首先,Struts2框架是Apache软件基金会的产品,它在原有的Struts1基础上进行了大幅度的改进,提供更灵活的控制流、更丰富的拦截器和插件机制,使得开发者能够更加高效地构建Web应用。 1. **MVC模式**:Struts2遵循...