Struts1.1的新功能
Struts1.1与1.0相比加了一些很不错的功能。最主要是表单验证上功能增强。在Struts1.1数据的验证不象以前在Action中在validator具体实现,而是在validation.xml通过配置实现这样做的好处就是重用性加强了很多。
Struts1.1实现的主要组成
主要包括:Action,ActionForm,ActionMapping,ActionForward,开发当中最主要写的是Action,ActionForm根据需要可以写或不写。下面我就一一具体介绍。
Action
An Action is an adapter between the contents of an incoming HTTP request and the corresponding
business logic that should be executed to process this request.
上面是Struts开发小组对Action的描述,说Action实际上Request和Business Logic中间的适配器.通俗的说就是从表单中取到数据并穿给商业逻辑操作进行一系列的操作,然后返回相应的操作信息。
ActionForm
An ActionForm is a JavaBean optionally associated with one or more ActionMappings. Such a bean
will have had its properties initialized from the corresponding request parameters before the
corresonding action's execute() method is called.
ActionForm实际上就是把从Request取到的数据封装并进行校验,然后把合法的数据给Action进行处理。实际上ActionForm除了进行数据校验之外另外更重要的是在表单回写的时候作用很大。反而在1.1以后数据校验的大部分工作在validation.xml去实现。
ActionMapping,ActionForward
ActionMapping主要是用与配置和描述相关属性使用的。先看下在struts-config.xml
中的配置文件一段配置描述:
type="com.bingo.finance.action.UseregAction"
name="useregForm"
scope="request"
validate="true"
input="/usereg.jsp">
ActionMapping就是用来描述一个Action的URL、具体实现的文件、相对应的ActionForm 数据属性(request or session)、是否需要进行数据校验和回写、以及处理完成后可能跳转的URL.
而ActionForward你就可以理解为Action 操作完成后的跳转URL,Action在处理完相关操作后,返回的是一个ActionForward也就是告诉Struts我做完这个操作下一步到哪儿去。
构建Struts1.1运行环境
我的配置是居于Tomcat4.0以上版本讨论,其他的AppServer大致相同。
1:得到Struts1.1
http://jakarta.apache.org/builds/jakarta-struts/release/v1.1-b1/jakarta-struts-1.1-b1.zip
2:设置
把Struts.jar Copy到$Tomcat_home/common/lib 或你使用Struts的Appaction下的WEB-INF/lib下
在你使用Struts的Appaction下web.xml中增加下列配置
action
org.apache.struts.action.ActionServlet
config
/WEB-INF/struts-config.xml
debug
3
detail
3
2
/WEB-INF/struts-html.tld
/WEB-INF/struts-html.tld
/WEB-INF/struts-logic.tld
/WEB-INF/struts-logic.tld
/WEB-INF/struts-nested.tld
/WEB-INF/struts-nested.tld
/WEB-INF/struts-template.tld
/WEB-INF/struts-template.tld
Struts1.1中提供了很详细的例子,你可以仔细看看.
接下来你该根据需要配置struts-config.xml,以下是一个简单的例子
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
type="com.bingo.finance.action.UserForm"/>
type="com.bingo.finance.action.UseregAction"
name="useregForm"
scope="request"
validate="true"
input="/usereg.jsp">
parameter="com.bingo.finance.common.DisplayMsg"/>
上面的英文我相信你能够看懂。我就不做解释了。你需要继续配置validation.xml了,看如下
简单的例子.
上面validation.xml就是告诉Struts我的useregForm取到的数据应该做下面的验证
username是必须不能为空的并且最小长度为5,最大长度是20.
................
password,nickname,superpass基本一样我就不做更多说明.至次配置基本结束,我们要开始写第一个Struts 了。
开发Struts1.1
usereg.jsp
为了考虑页面的灵活性,在页面中显示的所有元素我都放在properties文件中并由com.bingo.finance.common.HtmlMsg这个文件取到.
===================================================================
<%@ page contentType="text/html;charset=GBK" %>
<%@ page import="java.io.*"%>
<%@ page import="com.bingo.finance.common.HtmlMsg"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%=HtmlMsg.TITLE_REGISET%> < meta http-equiv="Content-Type" content="text/html; charset=gb2312">
UseregActiom.java
===========================================================
package com.bingo.finance.action;
//java import
import java.io.IOException;
import java.util.Locale;
//servlet import
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//struts import
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
//finance import
import com.bingo.finance.action.UserForm;
import com.bingo.finance.manager.UserManager;
import com.bingo.finance.entity.User;
public class UseregAction extends Action {
//在Struts1.1以前使用perform
//struts1.1使用execute替代perform
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
try{
UserForm userForm=(UserForm)form;
UserManager userManager=new UserManager();
User user=userManager.formToEntity(userForm);
userManager.add(user);
//Insert into DataBase a Userinfo
}catch(Exception ex){
return mapping.findForward("error");
}
return mapping.findForward("success");
//ForWard is "/msg.jsp"
}
}
UserForm.java
=========================================================================
package com.bingo.finance.action;
import java.util.*;
import java.io.Serializable;
//servlet import
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//struts import
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.ValidatorForm;
public class UserForm extends ValidatorForm implements Serializable{
//在Struts1.1以前通常Form继承ActionForm
//实际上ValidatorForm是继承ActionForm
//为什么要加一层ValidatorForm是为了校验而做的
private String id;
private String username;
private String password;
private String nickname;
private String superpass;
public UserForm(){
}
/****/
public String getId(){
return this.id;
}
/****/
public void setId(String _id){
this.id=_id;
}
/****/
public String getUsername(){
return this.username;
}
/****/
public void setUsername(String _username){
this.username=_username;
}
/****/
public String getPassword(){
return this.password;
}
/****/
public void setPassword(String _password){
this.password=_password;
}
/****/
public String getNickname(){
return this.nickname;
}
/****/
public void setNickname(String _nickname){
this.nickname=_nickname;
}
/****/
public String getSuperpass(){
return this.superpass;
}
/****/
public void setSuperpass(String _superpass){
this.superpass=_superpass;
}
/**show this class info**/
public String toString(){
StringBuffer info=new StringBuffer();
info.append("....id is:"+id);
info.append("....username is:"+username);
info.append("....password is:"+password);
info.append("....nickname is:"+nickname);
info.append("....superpass is:"+superpass);
return info.toString();
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
id=null;
username=null;
password=null;
nickname=null;
superpass=null;
}
}
UserManager.java ,User.java文件我就不提供了,这一部分在实际的开发当中根据需要自己去处理,也就是为了把数据插入数据库。
现在一个简单的注册用户你就开发完成了。很简单吧。呵呵,继续努力...但其中还有很多 细节你需要进一步了解,我只把你领到门了,你必须自己去研究一些东西,比如说,我希望我的用户多一个Email字段和一个年龄字段我应该如何做,而且我希望validation.xml的验证有Email合法验证,年龄必须大于0而且一定是整数。那我应该如何做?我只能告诉你加两个字段你需要修改Form 增加字段,同时相应文件也要修改。在struts中Email的验证非常简单。好好看例子吧,好好研究validator-rules.xml,这个我认为struts1.1最好的功能增加(Struts1.0没有这个文件)。Struts中提供了一个非常灵活而且重用极高的验证机制。
Struts和其他开发方式的比较
使用Struts开发至少带来如下好处:
1:层次结构非常清晰,也使得分工很明确。
2:重用度很高,连数据验证都可以重用,还有一个更好的重用就是Form,Action是可以很好的重用的。
3:可维护性好。这是居于第一点的。
.................