struts1课堂笔录

struts1 7大组件

ActionServlet 控制器
Action 包含事务逻辑
ActionForm 显示模块数据 数据模型
ActionMapping 帮助ActionServlet控制器将请求映射到操作
ActionForward 用来指示操作转移的对象
ActionError 用来存储和回收错误
Struts标记库 可以减轻开发显示层次的工作


mvc

model------actionform
v---------jsp
contrl----actionservlet 核心控制器
业务控制器 action


1 helloworld(不带form)
strutt1.2与1.3在lib上的差别 由于1.2中没有标签库包 ,所以需要相关的tld文件
(struts-bean.tld,struts-html.tld,struts-logic.tld,struts-nested.tld,struts-tiles.tld)
(1)导包 拷贝需要相关的tld文件(1.2)
(2)写action类 继承action 重写execute方法
public class HelloWorldAction extends Action {

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//HelloWorldForm hwForm = (HelloWorldForm) form;
//hwForm.setMessage("Hello World");
return mapping.findForward("success");
}
}
(3)在web-inf新建struts-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">


<struts-config>
<action-mappings>
<action input="/jsp页(如xx.jsp)" path="/取个名字" scope="session" type="包名.类名">
<forward name="取个名字" path="/jsp页(如xx.jsp)" />
</action>
<action path="/取个名字" forward="/jsp页(如xx.jsp)"/>
</action-mappings>
</struts-config>


(4)在web.xml进行struts配置
<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>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
(5)运行 http://localhost:端口号/应用名/配置的path
演示不同路径访问 以及传值回jsp页面

2 helloworld(在1的基础上 带form)

(1) 编写ActionForm 继承ActionForm 里面提供相关属性的set与get方法

(2) 在struts-config.xml配置 form-bean

<form-beans>
<form-bean name="取个名字" type="包名.类名"/>
</form-beans>

在action配置处加入 name=上面配置的form名 指定formbean的scope (request或者session) 可再次演示request属性值丢失问题

如下
<action path="/login" type="com.Login" name="loginForm" scope="request">

一个action只绑定一个form

演示 request或者session的formbean使用
action类中的代码 给HelloForm设置一个属性
HelloForm f=(HelloForm)form;
f.setName("pppppppppp");


采用BeanUtils拷贝属性值到相关的javabean中
Person p=new Person();
BeanUtils.copyProperties(p, loginForm);


在jsp页面上取出来
<%
HelloForm f=(HelloForm)session.getAttribute("helloform"); //此处的属性helloform就是在struts-config.xml的formbean名称
out.print(f.getName());

%>
(3) actionform如何自动获取页面值 只需要form表单中名字与formbean名字相同即可

(4)ActionForm的类型自动转换
* 基本的数据类型都可以自动进行转换;
* java.sql.Date 默认的转换格式是 yyyy-MM-dd;
* java.util.Date 默认不可以转换;可自定义类型转换器

自定义转换器的实现步骤:
1. 定义一个实现了Converter接口的类,并且实现convert方法;
2. 定义一个servlet来注册转换器,注册转换器引用ConvertUtils类的静态方法register(转换器,转换类型);
* ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
3. 配置servlet时注意配上这个<load-on-startup>5</load-on-startup>值要大于0,因为这个servlet要求在tomcat启动时初始化;
4. 第二种方法注册转换器通过实现PlugIn接口,在struts-config.xml中配置上<plug-in

1.先申明一个转换类
package com;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.Converter;
public class UtilDateConverter implements Converter {

@Override
public Object convert(Class type, Object value) {
// TODO Auto-generated method stub
System.out.println("UtilDateConverter.value=" + value);
if (value == null) {
return value;
}

if (value instanceof Date) {
return value;
}

Date d = null;
if (value instanceof String) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
d = sdf.parse((String) value);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return d;
}

}


2 方法1.使用servlet注册

package com;

import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.commons.beanutils.ConvertUtils;

/**
* 注册java.util.date转换器
*
* @author Administrator
*
*/
public class UtilDateConverterInitWithServlet extends HttpServlet {

@Override
public void init() throws ServletException {
System.out.println("UtilDateConverterInitWithServlet.init()");
ConvertUtils.register(new UtilDateConverter(), Date.class);
}

}

其中web.xml文件加上
<servlet>
<servlet-name>UtilDateConverterInitWithServlet</servlet-name>
<servlet-class>com.UtilDateConverterInitWithServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>


方法2.使用struts中的plug-in进行注册

package com;

import java.util.Date;
import javax.servlet.ServletException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class UtilDateConverterInitWithPlugin implements PlugIn {

public void destroy() {
}

public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException {
System.out.println("UtilDateConverterInitWithPlugin.init()");
ConvertUtils.register(new UtilDateConverter(), Date.class);
}
}

其中struts-config.xml文件加上

<plug-in className="com.UtilDateConverterInitWithPlugin"/>


* ActionForm中的其他属性
//以下属性都需要new 否则空指针
private List<String> friends = new ArrayList<String>();
private static String[] skillLevels = new String[] { "Beginner",
"Intermediate", "Advanced" };
private Map<String, Object> skills = new HashMap<String, Object>();
private List tbList = new AutoArrayList(TestBean.class);



public List<TestBean> getTbList() {
return tbList;
}

public void setTbList(List<TestBean> tbList) {
this.tbList = tbList;
}

public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
return null;
}

public void reset(ActionMapping mapping, HttpServletRequest request) {

this.friends.clear();
}

public Object getSkill(String key) {
return skills.get(key);
}

public void setSkill(String key, Object value) {
skills.put(key, value);
}

public Map getSkills() {
return skills;
}

public String[] getSkillLevels() {
return skillLevels;
}

public List<String> getFriends() {
return friends;
}

public void setFriends(List<String> friends) {
this.friends = friends;
}

//一下方法比上面少一个s 自己实现
public void setFriend(int index, String friend) {
if (this.friends.size() > index) {
/* 用指定的元素替代此列表中指定位置上的元素 */
this.friends.set(index, friend);
} else {
while (this.friends.size() < index) {
this.friends.add(null);
}
this.friends.add(index, friend);
}
}

//一下方法比上面少一个s 自己实现

public String getFriend(int index) {
if (this.friends.size() > index) {
return (String) this.friends.get(index);
} else {
return null;
}
}


AutoArrayList代码实现

public class AutoArrayList extends ArrayList {

private Class itemClass;

public AutoArrayList(Class itemClass) {
this.itemClass = itemClass;
}

public Object get(int index) {
try {
while (index >= size()) {
add(itemClass.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
return super.get(index);
}
}


输入页面示例

<html:form action="collection_test.do" method="post">
Friend 1 :<html:text property="friend[0]"></html:text><br> <!-- 调用setFriend(int index,String friend)-->
Friend 2 :<html:text property="friend[1]"></html:text><br>
Friend 3 :<html:text property="friend[2]"></html:text><br>
java skill: <html:select property="skill(java)"> <!-- 调用setSkill(String key,Object value) -->
<html:options property="skillLevels"/>
</html:select><br>
jsp skill:<html:select property="skill(jsp)">
<html:options property="skillLevels"/>
</html:select><br>
struts skill:<html:select property="skill(struts)">
<html:options property="skillLevels"/>
</html:select><br>

tbList 1 :<html:text property="tbList[0].name"></html:text><br>
tbList 2 :<html:text property="tbList[1].name"></html:text><br>
tbList 3 :<html:text property="tbList[2].name"></html:text><br>

<input type=submit></input>
</html:form>

输出页面示例
Friend 1:<bean:write name="collectionForm" property="friend[0]"/><br><!-- 调用getFriend(int index)-->
Friend 2:<bean:write name="collectionForm" property="friend[1]"/><br>
Friend 3:<bean:write name="collectionForm" property="friend[2]"/><br>

java skill :<bean:write name="collectionForm" property="skill(java)"/><br><!-- 调用getSkill(String key) -->
jsp skill :<bean:write name="collectionForm" property="skill(jsp)"/><br>
struts skill :<bean:write name="collectionForm" property="skill(struts)"/>





跳转演示
登录练习

地址栏斜杠的演示 / 如何精确定位action

多个方法的演示(增加,删除,修改)

3 Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的
并且要在开发时特别小心。Action资源必须是线程安全的或同步的。


4 全局转发与局部转发 全局异常与局部异常
<global-forwards>
<forward name="xxx" path="/global.jsp"></forward>
<forward name="success" path="/uuu.jsp"></forward>
</global-forwards>
全局转发 所有的action共用 局部转发 自己的action用 当两者重名时,优先选择局部转发


全局异常与局部异常(附件 struts1.x中的异常处理.txt)
<global-exceptions>
<exception key="资源文件中的key" type="包名.类名(如java.lang.ArithmeticException") path="/error.jsp"></exception>
</global-exceptions>

在error.jsp页面 <html:errors/>获取异常信息

全局异常 所有的action共用 局部异常 自己的action用 当两者重名时,优先选择局部异常


5 资源文件的使用 默认情况下,Struts默认的资源文件为ApplicationResources.properties文件。

在src目录下建立一个properties文件 一般为ApplicationResource.properties 里面写着键值对信息

aaa=111
bbb=222
ccc=333
在 struts-config.xml中配置使用资源文件 与<action-mappings>同级别,一般在<action-mappings>后,
<message-resources parameter="文件名(不需要后缀名)"/> 如上的配置为<message-resources parameter="ApplicationResource"/>

如果该资源文件不在src目录下,而在其他包名下,则应加上包名,假设ApplicationResource.properties在com包下,则配置修改为
<message-resources parameter="com/ApplicationResource"/>

资源文件中文乱码解决 native2ascii -encoding gbk ApplicationResources_zh_CN.properties temp.properties
或者用jinto插件进行编辑


在jsp页面上通过bean标记 可输出资源文件的内容
<bean:message key="aaa"/>
在页面上将显示111



ActionError与ActionMessage
actionError 1.1版本 1.2版本推出actionMessage actionMessage是actionError的父类
actionError从语义上一般是指错误信息 actionMessage指的是一般信息

ActionError类与ActionErrors类
ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中。ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的属性值,或是使用ActionErrors.GLOBAL_ERROR.

如下使用
ActionErrors errors = new ActionErrors();
ActionError error = new ActionError("资源文件中的key值",“要传递进去的参数值(一个或多个(字符串数组))");
errors.add(ActionErrors.GLOBAL_ERROR,error);//或者使用
errors.add("属性名",error )
saveErrors(req,errors);

在页面上通过

<html:errors /> 显示所有错误

<html:errors property="属性名"/> 显示对应的属性错误

ActionError类有两个构造方法 分别有一个参数和两个参数的
一个参数的 参数就是资源文件中的键值
两个参数的 第一个参数是资源文件中的键值,第2个参数是我们可以传进资源文件中的参数值


ActionMeaaage类与ActionMeaaages类


<html:messages id="aaa" property="属性名" message="true">
<bean:write name="aaa"/>
</html:messages>


6 dispatchaction action类继承DispatchAction 不需要重写execute方法 否则失效 因为默认进入execute方法
(1)编写如下类似方法
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("进入add方法");
return mapping.findForward(SUCCESS);
}

public ActionForward update(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("进入update方法");
return mapping.findForward(SUCCESS);
}
(2)在action配置处加入parameter="method"
(3)调用该action时传参数methoda=add或者其他方法名即可

小技巧 不需要强转
String name = (String) PropertyUtils.getSimpleProperty(form, "userName");
String password = (String) PropertyUtils.getSimpleProperty(form, "password");


7 actionforward

ActionForward aw=new ActionForward();
aw.setPath("/taglibdemo.jsp");
return aw;

8 标记库 三大核心 name property value(value可放到嵌套外 <html:multibox property="hobby" value="drink" /> 等价于<html:multibox property="hobby" >drink</html:multibox>)
<logic:iterate>
<bean:write> filter="false" 显示含html标签的 输出int类型的时候加上format属性 format="#"
<bean:define> 使用map中bean演示
<logic:empty>
<logic:present> 作用域是否存在当前name
复选框与下拉框使用

婚否:<html:checkbox property="marry"></html:checkbox> 单个复选框

<br> 多个复选框
爱好 :<html:multibox property="hobby" value="drink" />喝水
<html:multibox property="hobby" value="sleep"></html:multibox>睡觉
<html:multibox property="hobby" value="doxxx"></html:multibox>瞎搞


用<bean:write>演示actionform

// action中片段代码

//list中放简单基本数据
List listBasic=new ArrayList();
listBasic.add("test1");
listBasic.add("test2");
listBasic.add("test3");
listBasic.add("test4");
request.setAttribute("listBasic", listBasic);

// list中 bean
List listBean=new ArrayList();
TaglibBean tb=new TaglibBean();
tb.setName("TaglibBean1");
tb.setAge(11);
tb.setMoney(12.4567);
listBean.add(tb);

tb=new TaglibBean();
tb.setName("TaglibBean2");
tb.setAge(12);
tb.setMoney(12.111);
listBean.add(tb);

tb=new TaglibBean();
tb.setName("TaglibBean3");
tb.setAge(13);
tb.setMoney(12.2222222222);
listBean.add(tb);

request.setAttribute("listBean", listBean);

//hashmap 简单数据
Map map=new HashMap();
map.put("mapkey1", "mapvalue1");
map.put("mapkey2", "mapvalue2");
map.put("mapkey3", "mapvalue3");
request.setAttribute("map", map);

//hashmap 放bean
Map beanMap=new HashMap();
tb=new TaglibBean();
tb.setName("TaglibBean1map");
tb.setAge(11);
tb.setMoney(12.4567);
beanMap.put("mapkey1map", tb);

tb=new TaglibBean();
tb.setName("TaglibBean2map");
tb.setAge(12);
tb.setMoney(12.111);
beanMap.put("mapkey2map", tb);

tb=new TaglibBean();
tb.setName("TaglibBean3map");
tb.setAge(13);
tb.setMoney(12.2222222222);
beanMap.put("mapkey3map", tb);
request.setAttribute("beanMap", beanMap);

//html标签输出 使用filter=false
String strTable="<table border=1><tr><td>aaaa</td></tr></table>";
request.setAttribute("strTable", strTable);

//类似 if else
String ifStr="xxx";
request.setAttribute("ifStr", ifStr);

//单独bean 属性比较 if else
tb=new TaglibBean();
tb.setName("onlyyou");
request.setAttribute("onlybean", tb);


//jsp中片段代码 (附件taglibdemo.jsp)
1 logic:present与logic:iterate 简单集合数据<br>
<logic:present name="listBasic">
xxxx
<logic:iterate name="listBasic" id="element" >
<bean:write name="element"/><br>
</logic:iterate>

</logic:present>

<logic:notPresent name="listBasic">
作用域不存在listBasic
</logic:notPresent>


2 logicempty与logic:iterate 简单集合数据<br>

<logic:notEmpty name="listBasic">

<logic:iterate name="listBasic" id="element" >
<bean:write name="element"/><br>
</logic:iterate>

</logic:notEmpty>


<logic:empty name="listBasic">

集合元素为空
</logic:empty>


3 logicempty与logic:iterate list中 bean (含bean 中list)<br>

<logic:notEmpty name="listBean">

<logic:iterate name="listBean" id="element" >
<bean:write name="element" property="name"/><br>
<bean:write name="element" property="age" format="#.00"/><br>
<bean:write name="element" property="money" format="#.000"/><br>
<logic:notEmpty name="element" property="list">

<logic:iterate name="element" id="bean_list" property="list">
<bean:write name="bean_list"/><br>
</logic:iterate>

</logic:notEmpty>


</logic:iterate>

</logic:notEmpty>


4 logicempty与logic:iterate map<br>

<logic:notEmpty name="map">
<logic:iterate name="map" id="element">
<bean:write name="element" property="value"/><br>
</logic:iterate>
</logic:notEmpty>

5 hashmap 放bean<br>

<logic:notEmpty name="beanMap">
<logic:iterate name="beanMap" id="element">
<bean:define id="map_bean" name="element" property="value"/>
<bean:write name="map_bean" property="name"/><br>
</logic:iterate>
</logic:notEmpty>


6 作用域中的简单字符串 html标签输出 使用filter=false<br>
<logic:present name="strTable">
<bean:write name="strTable" filter="false"/>
</logic:present>


7 类似if else<br>

<logic:equal name="ifStr" value="xxx">
等于 xxx
</logic:equal >

<logic:notEqual name="ifStr" value="xxx">
不等于 xxx
</logic:notEqual >


7 类似if else 单独bean<br>
<logic:equal name="onlybean" property="name" value="xxx">
等于 xxx
</logic:equal >

<logic:notEqual name="onlybean" property="name" value="xxx">
<bean:write name="onlybean" property="name"/>
</logic:notEqual >


9 动态form 不能通过new创建实例 减少actionform的个数

动态ActionForm是struts从1.1版本开始引入一项新的技术,即在创建ActionForm时
可以不用通过编程的方式而只要通过struts-config.xml文件中进行配置,以后在struts运行时,会自动根

据struts-config.xml中配置的DynaActionform来生成一个Action实例
为什么要使用DynaActionform

很显然随着应用程序的变大,数百个ActionForm 这样不仅编程起来麻烦,以后维护起来也麻烦,比如:

某个属性变化了,则需要修改源代码,然后重新编译,但是如果使用DynaActionform则只需要修改

struts-config.xml配置文件就行了。这样提高了应用程序的开发效率与应用程序的可维护性

声明动态Form

声明一个动态Form非常简单,只需要在struts- config.xml的<form-beans>元素中加入一个<form-bean>子元素,并使用<form- property>元素来定义动态Form的属性。我们可以定义的属性类型有简单属性(如String)、索引属性(如数组)、映射属性(如 HashMap)以及嵌套属性(属性类型是另一个类)。
对于动态Form来说,Form的类型必须是org.apache.struts.action.DynaActionForm或其子类。声明一个动态Form的代码如下:
<form-bean name="dynamicForm" type="org.apache.struts.action.DynaActionForm">
<!-- 声明一个简单属性 -->
<form-property name="simpleProp" type="java.lang.String" initial="bill"/>
<!-- 声明一个索引属性 -->
<form-property name="indexedProp" type="java.lang.String[]" />
<!-- 声明一个映射属性 -->
<form-property name="mappedProp" type="java.util.HashMap" />
<!-- 声明一个嵌套属性 -->
<form-property name="nestedProp" type="com.bean.MyBean" />
</form-bean>

动态Form的属性类型
下面列出了动态Form支持的简单属性的所有类型:

java.math.BigDecimal
java.math.BigInteger
java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Class
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Short
java.lang.String
java.sql.Date
java.sql.Time
java.sql.Timestamp

DynaActionForm还支持由这些数据类型构成的数组(比如String)、Map接口的实 现类(比如java.util.HashMap)、
List接口的实现类(如 java.util.ArrayList)。如果你没有给属性设定初值,数字类属性会自动设定为0,对象类属性设定为null。
如果使用基本的 Struts标志库访问DynaActionForm对象的属性,访问的方法和访问普通ActionForm对象的方法相同。


如果使用动态Form,就无法使用泛型进行自动类型转换了

下面的代码演示了如何通过getter方法获得动态Form的属性值:

DynaActionForm dForm = (DynaActionForm)form;
String name = (String)dForm.get("name");
String[] hobbies = (String[])dForm.get(“hobbies”);
String value1 = (String)dForm.get(“myMap”, “key1”);

下面的代码演示了如何通过getString和getStrings方法获得动态Form的属性值:

String name = dForm.getString(“name”); // 相当于String name = (String)dForm.get("name");
String[] hobbies = dForm.getStrings(“hobbies”); // 相当于String[] hobbies = (String[])dForm.get(“hobbies”);


10 国际化
国际化资源文件命名规则: 前缀.<语言>_<地区>.properties

116 zh-cn Chinese(PRC) 中文 - 中华人民共和国 0x0804 2052
117 zh-hk Chinese(Hong Kong SAR, PRC) 中文 - 中华人民共和国香港特别行政区 0x0C04 3076
118 zh-sg Chinese(Singapore) 中文 - 新加坡 0x1004 4100
119 zh-tw Chinese(Taiwan Region) 中文 - 台湾地区 0x0404 1028
120 zu Zulu 祖鲁语 0x0435 1077


1 修改浏览器语言
2 编码实现
把语言编码放进session中,其中session的名字为org.apache.struts.action.LOCALE,此后struts1就可以格局这个session值进行选择相对应的语言配置文件进行显示
例如
if(language.equals("chinese"))
session.setAttribute("org.apache.struts.action.LOCALE", Locale.CHINESE);
else
session.setAttribute("org.apache.struts.action.LOCALE", Locale.ENGLISH);


11 验证以及验证框架
一种是通过ActionForm的validate函数进行验证,另一种就是利用validate框架进行验证

校验没有通过 返回input指定的页面 必须配置input页面

六种类的关系:

1:普通form(从下向上继承)
ActionForm //不用验证框架作验证 如要验证 重写validate方法
|
|
validatorForm //使用验证框架时必须继承它,但只能做同一种验证(即form验证)
|
|
validatorActionForm //使用验证框架验证时,可以更为精确的去处理业务逻辑,针对的是不同的按键的path(即可以作不同的验证,如,既可以验证是否为空,又可以同时验证是否小于几位)

2:动态form(从下向上继承)
DynaActionForm //不用验证框架作验证 如要验证 写一个form类继承它 重写validate方法 struts-config.xml配置时改为你写的类
|
|
DynaValidatorForm
|
|
DynaValidatorActionForm


对于 validatorForm 和DynavalidatorForm 是针对form的验证
对于 validatorActionForm 和DynavalidatorActionForm 是针对path的验证


启动验证框架

在struts-config.xml配置验证框架插件
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>


可以通过在struts-config.xml中配置action时指定 validate="false" 关闭验证框架


创建Validation.xml

下面介绍一下validation.xml配置文件的标签:
<form-validation></form-validation>是总框架
<formset></formset>是对Form里的数据进行配置
<form name="ActionForm对应的名称"></form>对一个ActionForm里的数据进行验证配置
<field property="ActionForm里的属性名" depends="验证规则,可以是Validation-rules里定义好的也可以是自定义的验证规则">这里配置一个属性的验证内容
<arg0 name="对应的验证规则名称" key="可以直接填入数值,也可填入变量表达式:${var:变量名}" resource="true/false"(代表是否从资源文件中读取信息,否则Key的值以参数的形式返回)>
<var></var>定义一个变量的标签体,可以在里面具体设置变量的名称以及数值
<var-name>对应Key里定义的变量名称</var-name>
<var-value>值</var-value>
<msg name="对应的验证规则名称" key="资源文件中定义的key名称">这里定义了key后,会使用自己的定义的key,否则使用验证规则默认定义的key
在验证规则中大部分可以使用已经预定义好的规则,它们在validator-rules.xml里,当然我们自己也可以定义规则。

其实,这个文件名可以是任意的,可以起成别的名字,比如:validators.xml,不过,也要相应修改struts-config.xml文件中的加入validator框架PlugIn中的value属性。这个value属性用来指定validator-rules文件和具体的验证文件。

1)根元素:
validators.xml文件的“根元素(Root)”是form-validation,
意味着整个文件的内容包含在“<form-validation>”和“</form-validation>”之间,

2)元素global:
这个东西包含constant子元素,用来定义一个全局的“验证限制”,
以便在这个文件的其他地方使用这些验证规则。

如下global phone的应用
<golobal>
<constant>
<constant-name>phone</ constant-name>
<constant-value>7</constant-value>
</constant>
</golobal>


<formset>
<form name="loginValidatorForm">
<field property="userName" depends="required">
<msg name="required" key="invalid"/>

<!--
<msg name="required" key="invalid"/>
意思是当不满足验证规则required时将会用资源文件中key为invalid的值填充actionerror,相当于
ActionErrors errors=new ActionErrors();
errors.add("userName", new ActionError("invalid"));<!--userName为验证的属性名-->
,之后在页面上用<html:errors property="userName"/>显示相应资源文件中的键值对应的提示信息
如果没有这句话,则不满足验证规则required时将会在资源文件中寻找默认的key值。默认的key值在验证规则文件中有,如required默认的key为errors.required
而如果设置resource="false" 即 <msg name="required" key="invalid" resource="false"/> ,则不使用资源文件 这里的key什么值,页面上就提示什么值

-->
<arg0 key="username" />

</field>
<field property="password" depends="required,minlength,maxlength">

<arg0 key="password"/>
<msg name="minlength" key="密码不能小于6位" resource="false"/>
<msg name="maxlength" key="密码不能大于8位" resource="false"/>
<var>
<var-name>minlength</var-name> <!--变量名必须为minlength -->
<var-value>${phone}</var-value> <!--phone为上面定义的常量 -->
</var>
<var>
<var-name>maxlength</var-name> <!--变量名必须为maxlength -->
<var-value>8</var-value>
</var>
</field>
</form>
</formset>


传参数到minlength
<field
property="password"
depends="required,minlength">
<arg0 key="LoginForm.password"/>
<arg1 key="${var:minlength}" name="minlength" resource="false"/> <!--resource="false" 表示不从资源文件取值,而是用当前值。而当前值${var:minlength}表示取变量名为minlength的值 -->
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
</field>


正则表达式例子
<field
property="password"
depends="required,mask">
<arg key="logonForm.password"/>
<var>
<var-name>mask</var-name>
<var-value>^[0-9a-zA-Z]*$</var-value> <!--数字与字母-->
</var>
</field>

日期验证例子
<field
property="date" <!--非常遗憾的通知你 date属性在form中的类型为字符串类型-->
depends="required,date">
<arg key="userForm.date"/>
<var>
<var-name>datePattern</var-name>
<var-value>yyyy-MM-dd</var-value>
</var>
</field>



基本验证规则:
名称 描述
byte,short,integer, 检验值是否能被转换成对应的基本数据类型
long,float,double
creditCard 检验输入域是否是一个合法的信用卡号码
date(有点失望) 检验输入域是否是一个合法日期 form中对应的date类型为字符串类型 只验证字符串类型 有点失望
email 检验输入是否是一个合法Email地址
mask 检验输入域是否能成功匹配一个正则表达式
maxLength 检验值的长度是否小于等于给定的最大长度
minLength 检验值的长度是否大于等于给定的最小长度
range 检验值的范围是否在最大值和最小值之间
required 检验输入域是否为不为空,或不包含空格值的长度是否大于零


struts1对客户端校验的支持
validateform名 form名首字母大写 <html:javascript formName="form名" /> 如下例子


<html:form action="/Login" οnsubmit="return validateLoginForm(this);">
<html:javascript formName="LoginForm" />
</html:form >


12 tiles框架
Tiles框架提供了一种模板机制,它可以将网页内容和布局分离,并允许先创建模板,然后在页面中再插入具体的内容。
Tiles框架是Struts的一个插件。我们可以使用Tiles框架来进行页面布局设计。

使用tiles步骤
在所使用tiles标签页面引入 <%@taglib prefix="tiles" uri="/WEB-INF/struts-tiles.tld"%>
1 先定义一个模板 做好一个模板页面 例如 以下两种方式均可
1.1 使用<tiles:get>标签定义模板
<table border=1>
<tr>
<td><tiles:get name="header"/></td>
</tr>
<tr>
<td><tiles:get name="main"/></td>
</tr>
<tr>
<td><tiles:get name="footer"/></td>
</tr>
</table>
1.2 使用<tiles:insert>标签定义模板
<table border=1 bgcolor="red">
<tr>
<td><tiles:insert attribute="header"></tiles:insert> </td>
</tr>
<tr>
<td><tiles:insert attribute="main"></tiles:insert></td>
</tr>
<tr>
<td><tiles:insert attribute="footer"></tiles:insert></td>
</tr>
</table>

2 使用模板页面 使用<tiles:insert>与<tiles:put>标签
<tiles:insert page="模板页面.jsp" > <!--page为刚刚定义的模板页面 也可用template 如 <tiles:insert template="模板页面.jsp" > -->
<tiles:put name="header" value="header.jsp"></tiles:put>
<!--name 是刚刚在模板页面定义的名字 value表示要在该位置下放的页面 也可用content <tiles:put name="header" content="header.jsp"></tiles:put> -->
<tiles:put name="main" value="main.jsp"></tiles:put>
<tiles:put name="footer" value="footer.jsp"></tiles:put>
</tiles:insert>



在struts1使用tiles


1 在Struts应用程序中使用Tiles,我们需要添加如下<plug-in>定义到struts-config.xml文件。

<plug-in className="org.apache.struts.tiles.TilesPlugin" >
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
<set-property property="moduleAware" value="true" />
</plug-in>
2 tiles-defs.xml 以下示例 定义baseLayout friends和office都继承了它
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name="baseLayout" path="/模板页面.jsp">
<put name="header" value="/header.jsp" />
<put name="main" value="/menu.jsp" />
<put name="footer" value="/footer.jsp" />
</definition>
<definition name="friends" extends="baseLayout"><!--继承baseLayout-->
<put name="body" value="/friends.jsp" />
</definition>
<definition name="office" extends="baseLayout">
<put name="body" value="/office.jsp" />
</definition>
</tiles-definitions>

3 修改struts-config.xml 注意path的值 为 tiles-defs.xml文件中的定义definition name
<action-mappings>
<action path="/Link" parameter="method" type="com.vaannila.LinkAction">
<forward name="friends" path="friends"/> <!--这里的path 与原来不一样哦-->
<forward name="office" path="office"/>
</action>
<action path="/Welcome" forward="/welcomeStruts.jsp"/>
</action-mappings>


13 源代码
初始化
1 initinternal 初始化资源文件
2 initOther 初始化其他 (注册类型转换器)
3 intiServlet 初始化actionservlet本身 (读取servlet名称以及拦截的后缀名)
4 用Digester框架解析tstruts-config.xml 放进 MoudleConfig中
5 initModuleMessageResources
6 initModulePlugIns
7 moduleConfig.freeze


执行 doGet或者doPost
1调用process(request, response);
2 调用RequestProcessor的实例的process方法进行处理
2.1processLocale 国际化
2.2

BeanUtils.populate 进行hashmap属性值拷贝到创建的actionform实例中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值