- 浏览: 23066 次
- 性别:
- 来自: 广州
文章分类
最新评论
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
(2) 在struts-config.xml配置 form-bean
<form-beans>
<form-bean name="取个名字" type="包名.类名"/>
</form-beans>
在action配置处加入 name=上面配置的form名 指定formbean的scope (request或者session) 可再次演示request属性值丢失问题
演示 request或者session的formbean使用
action类中的代码 给HelloForm设置一个属性
HelloForm f=(HelloForm)form;
f.setName("pppppppppp");
在jsp页面上取出来
<%
HelloForm f=(HelloForm)session.getAttribute("helloform"); //此处的属性helloform就是在struts-config.xml的formbean名称
out.print(f.getName());
%>
(3) actionform如何自动获取页面值 只需要form表单中名字与formbean名字相同即可
跳转演示
登录练习
地址栏斜杠的演示 / 如何精确定位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 资源文件的使用(附件 资源文件设置.txt) 默认情况下,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"/>
在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
(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 标记库
<logic:iterate>
<bean:write> filter="false" 显示含html标签的 输出int类型的时候加上format属性 format="#"
<bean:define>
<logic:empty>
<logic:present> 作用域是否存在
复选框与下拉框使用
用<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 (附件 动态form.txt)
动态ActionForm是struts从1.1版本开始引入一项新的技术,即在创建ActionForm时
可以不用通过编程的方式而只要通过struts-config.xml文件中进行配置,以后在struts运行时,会自动根
据struts-config.xml中配置的DynaActionform来生成一个Action实例
为什么要使用DynaActionform
很显然随着应用程序的变大,数百个ActionForm 这样不仅编程起来麻烦,以后维护起来也麻烦,比如:
某个属性变化了,则需要修改源代码,然后重新编译,但是如果使用DynaActionform则只需要修改
struts-config.xml配置文件就行了。这样提高了应用程序的开发效率与应用程序的可维护性
10 国际化
11 验证以及验证框架
一种是通过ActionForm的validate函数进行验证,另一种就是利用validate框架进行验证
六种类的关系:
1:普通form(从下向上继承)
ActionForm //不用验证框架作验证 如要验证 重写validate方法
|
|
validatorForm //使用验证框架时必须继承它,但只能做同一种验证(即只提交一个按键时的验证)
|
|
validatorActionForm //使用验证框架验证时,可以更为精确的去处理业务逻辑,针对的是不同的按键的path(即可以作不同的验证,如,既可以验证是否为空,又可以同时验证是否小于几位)
2:动态form(从下向上继承) 动态form不能new
DynaActionForm //不用验证框架作验证 如要验证 写一个form类继承它 重写validate方法 struts-config.xml配置时改为你写的类
|
|
DynaValidatorForm
|
|
DynaValidatorActionForm
我们自己的form 必须继承validatorForm 或validatorActionForm 或DynavalidatorForm 或DynavalidatorActionForm
对于 validatorForm 和DynavalidatorForm 是针对form的验证
对于 validatorActionForm 和DynavalidatorActionForm 是针对path的验证
创建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="资源文件中定义的变量名称">这里定义了信息变量后,会默认定义的信息变量。
在验证规则中大部分可以使用已经预定义好的规则,它们在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>
<form name=”checkoutForm”>
<field
property=”phone”
depends=”required,mask,minlength”>
<arg0 key=”label.phone”/>
<arg1 name=”minilength” key=”${var:minlength}” resource=”false”/>
<var>
<var-name>mask</ var-name >
<var-value>${phone} </var-value>
</var>
<var>
<var-name>minlength</ var-name >
<var-value>${phone}</var-value>
</var>
</field>
</form>
客服端提示 <html:form action="/loginValidatorForm.do" onsubmit="return validateLoginValidatorForm(this);">
<html:javascript formName="loginValidatorForm"/>
在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" 关闭验证框架
Tiles框架的提出背景:
传统的GUI工具包,如Java AWT和Java Swing,都提供了一些功能强大的布局管理器,它们指定各个视图组件在窗口中的分布位置。布局管理器有助于创建复合式的复杂界面,一个复合式界面由一些简单的基本界面组成。
利用布局管理器来创建GUI界面有以下优点:
可重用性:基本界面可以被重用,组合成各种不同的复合式界面
可扩展性:可以方便的扩展基本界面,从而创建更复杂的界面(其实此处我的感觉并非如此,可扩展性并不是为了创建复杂界面的,越是复杂的界面在比较独立的情况下更容易创建。)
可维护性:每个基本界面之间相互独立,当复合式界面中的局部区域发生变化,不会影响其它区域
不幸的是,JSP技术本身并没有直接提供布局或布局管理器。为了简化Web页面的开发,提高可重用性和可扩展性,Struts Tiles框架提供了一种模板机制,模板定义了网页的布局,同一模板可以被多个Web页面共用。此外,Tiles框架还允许定义可重用的Tiles组件,它可以描述一个完整的网页,也可以描述网页的局部内容。简单的Tiles组件可以被组合或扩展成为更复杂的Tiles组件。
Tiles框架的基本用法:
使用Tiles框架大大提高了视图层程序代码的可重用性、可扩展性和可维护性,也增加了开发视图的难度和复杂度,在使用Tiles框架之前一定要结合Web应用的规模。
在开发Web站点时,常常要求同一站点的所有Web页面保持一致的外观,比如有相同的布局、页头、页尾和菜单。 网页被划分为四个部分:Header、Menu、Footer和Content。对于同一站点的所有Web页面,Header、Menu和Footer部分的内容相同,仅仅Content部分的内容不相同。如果采用基本的JSP语句来编写所有的Web页面,显然会导致大量的重复编码,增加开发和维护成本。
Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。它允许先创建模板,然后在运行时动态地将内容插入到模板中。Tiles框架建立在JSP的include指令的基础上,但它提供了比JSP的include指令更强大的功能。
Tiles框架具有如下特性:
创建可重用的模板
动态构建和装载页面
定义可重用的Tiles组
支持国际化
Tiles框架包含以下内容:
Tiles标签库
Tiles组件的配置文件
TilesPlugIn插件
什么是tiles框架?
Tiles框架是struts的一个页面布局插件。提高了代码可重用性、可扩展性和可维护性,同时也增加了开发难度
tiles的特点?
1,可定义重用tiles组件
2,动态装载页面
3,支持国际化
4,能创建可重用模块
Tiles框架是Struts的一个插件。我们可以使用Tiles框架来进行页面布局设计。Tiles框架提供了一种模板机制,它可以将网页内容和布局分离,并允许先创建模板,然后在页面中再插入具体的内容。
一、安装Tiles框架
为了使用Tiles,我们必须首先在struts-config.xml文件中声明Tiles,配置代码如下:
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in>
其中org.apache.struts.tiles.TilesPlugin类只需要设置一个definitions-config属性。这个属性值指向了一个定义文件tiles-defs.xml。这个定义文件的基本格式如下:
<?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">
<!--
This is a blank Tiles definition file with a commented example.
-->
<tiles-definitions>
<definition name="yyy" path="/aaa.jsp">
</definition>
<definition name="base" path="/layout.jsp">
<put name="header" type="page" value="/header.jsp"/>
<put name="content" type="page" value="/content.jsp"/>
<put name="foot" type="page" value="/foot.jsp"/>
</definition>
<definition name="base1" extends="base">//继承
<put name="content" type="page" value="/content1.jsp"/>
</definition>
</tiles-definitions>
其中<tiles-definitions>元素中可以包含多个<definition>子元素。我们还可以将一个定义文件拆成多个定义文件,如A-defs.xml、B-defs.xml和C-defs.xml。在为definitions-config属性赋值时,如果有多个定义文件,中间用逗号(,)分割。如下面的代码所示:
<set-property property="definitions-config" value="/WEB-INF/A-defs.xml, /WEB-INF/B-defs.xml, /WEB-INF/C-defs.xml " />
Tiles框架还有一个定制标签库。我们可以使用如下的taglib指令来声明这个标签库:
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
二、<jsp:include>和<tiles:insert>标签
由于在编写Web程序的过程中,很多页面会出现同样的内容,如所有的页面都使用同样的的页头和页尾。在JSP标签库中提供了一个include标签可以将其他的页面包含到当前的页面中,如我们可以使用如下的代码包含页头和页尾。
<jsp:include page = "header.jsp" />
<jsp:include page = "footer.jsp" />
在Tiles框架的标签库中也提供了一个insert标签。这个标签也可以完成和include同样的工作。如上述代码也可以写成如下形式:
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<tiles:insert page = "header.jsp" />
<tiles:insert page = "footer.jsp" />
虽然include和insert标签都可以很好地解决代码重用问题,但是并不能完全避免代码重复的问题。如很多使用include或insert标签的页面也拥有很多类似或相同的代码。如使用css布局、用table、div等HTML元素进行位置控制等。如果想避免这些代码的重复。光使用include或insert标签是无法做到的。而要想做到这一点,就要使用下一篇文章中介绍的Tiles模板。
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
(2) 在struts-config.xml配置 form-bean
<form-beans>
<form-bean name="取个名字" type="包名.类名"/>
</form-beans>
在action配置处加入 name=上面配置的form名 指定formbean的scope (request或者session) 可再次演示request属性值丢失问题
演示 request或者session的formbean使用
action类中的代码 给HelloForm设置一个属性
HelloForm f=(HelloForm)form;
f.setName("pppppppppp");
在jsp页面上取出来
<%
HelloForm f=(HelloForm)session.getAttribute("helloform"); //此处的属性helloform就是在struts-config.xml的formbean名称
out.print(f.getName());
%>
(3) actionform如何自动获取页面值 只需要form表单中名字与formbean名字相同即可
跳转演示
登录练习
地址栏斜杠的演示 / 如何精确定位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 资源文件的使用(附件 资源文件设置.txt) 默认情况下,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"/>
在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
(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 标记库
<logic:iterate>
<bean:write> filter="false" 显示含html标签的 输出int类型的时候加上format属性 format="#"
<bean:define>
<logic:empty>
<logic:present> 作用域是否存在
复选框与下拉框使用
用<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 (附件 动态form.txt)
动态ActionForm是struts从1.1版本开始引入一项新的技术,即在创建ActionForm时
可以不用通过编程的方式而只要通过struts-config.xml文件中进行配置,以后在struts运行时,会自动根
据struts-config.xml中配置的DynaActionform来生成一个Action实例
为什么要使用DynaActionform
很显然随着应用程序的变大,数百个ActionForm 这样不仅编程起来麻烦,以后维护起来也麻烦,比如:
某个属性变化了,则需要修改源代码,然后重新编译,但是如果使用DynaActionform则只需要修改
struts-config.xml配置文件就行了。这样提高了应用程序的开发效率与应用程序的可维护性
10 国际化
11 验证以及验证框架
一种是通过ActionForm的validate函数进行验证,另一种就是利用validate框架进行验证
六种类的关系:
1:普通form(从下向上继承)
ActionForm //不用验证框架作验证 如要验证 重写validate方法
|
|
validatorForm //使用验证框架时必须继承它,但只能做同一种验证(即只提交一个按键时的验证)
|
|
validatorActionForm //使用验证框架验证时,可以更为精确的去处理业务逻辑,针对的是不同的按键的path(即可以作不同的验证,如,既可以验证是否为空,又可以同时验证是否小于几位)
2:动态form(从下向上继承) 动态form不能new
DynaActionForm //不用验证框架作验证 如要验证 写一个form类继承它 重写validate方法 struts-config.xml配置时改为你写的类
|
|
DynaValidatorForm
|
|
DynaValidatorActionForm
我们自己的form 必须继承validatorForm 或validatorActionForm 或DynavalidatorForm 或DynavalidatorActionForm
对于 validatorForm 和DynavalidatorForm 是针对form的验证
对于 validatorActionForm 和DynavalidatorActionForm 是针对path的验证
创建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="资源文件中定义的变量名称">这里定义了信息变量后,会默认定义的信息变量。
在验证规则中大部分可以使用已经预定义好的规则,它们在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>
<form name=”checkoutForm”>
<field
property=”phone”
depends=”required,mask,minlength”>
<arg0 key=”label.phone”/>
<arg1 name=”minilength” key=”${var:minlength}” resource=”false”/>
<var>
<var-name>mask</ var-name >
<var-value>${phone} </var-value>
</var>
<var>
<var-name>minlength</ var-name >
<var-value>${phone}</var-value>
</var>
</field>
</form>
客服端提示 <html:form action="/loginValidatorForm.do" onsubmit="return validateLoginValidatorForm(this);">
<html:javascript formName="loginValidatorForm"/>
在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" 关闭验证框架
Tiles框架的提出背景:
传统的GUI工具包,如Java AWT和Java Swing,都提供了一些功能强大的布局管理器,它们指定各个视图组件在窗口中的分布位置。布局管理器有助于创建复合式的复杂界面,一个复合式界面由一些简单的基本界面组成。
利用布局管理器来创建GUI界面有以下优点:
可重用性:基本界面可以被重用,组合成各种不同的复合式界面
可扩展性:可以方便的扩展基本界面,从而创建更复杂的界面(其实此处我的感觉并非如此,可扩展性并不是为了创建复杂界面的,越是复杂的界面在比较独立的情况下更容易创建。)
可维护性:每个基本界面之间相互独立,当复合式界面中的局部区域发生变化,不会影响其它区域
不幸的是,JSP技术本身并没有直接提供布局或布局管理器。为了简化Web页面的开发,提高可重用性和可扩展性,Struts Tiles框架提供了一种模板机制,模板定义了网页的布局,同一模板可以被多个Web页面共用。此外,Tiles框架还允许定义可重用的Tiles组件,它可以描述一个完整的网页,也可以描述网页的局部内容。简单的Tiles组件可以被组合或扩展成为更复杂的Tiles组件。
Tiles框架的基本用法:
使用Tiles框架大大提高了视图层程序代码的可重用性、可扩展性和可维护性,也增加了开发视图的难度和复杂度,在使用Tiles框架之前一定要结合Web应用的规模。
在开发Web站点时,常常要求同一站点的所有Web页面保持一致的外观,比如有相同的布局、页头、页尾和菜单。 网页被划分为四个部分:Header、Menu、Footer和Content。对于同一站点的所有Web页面,Header、Menu和Footer部分的内容相同,仅仅Content部分的内容不相同。如果采用基本的JSP语句来编写所有的Web页面,显然会导致大量的重复编码,增加开发和维护成本。
Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。它允许先创建模板,然后在运行时动态地将内容插入到模板中。Tiles框架建立在JSP的include指令的基础上,但它提供了比JSP的include指令更强大的功能。
Tiles框架具有如下特性:
创建可重用的模板
动态构建和装载页面
定义可重用的Tiles组
支持国际化
Tiles框架包含以下内容:
Tiles标签库
Tiles组件的配置文件
TilesPlugIn插件
什么是tiles框架?
Tiles框架是struts的一个页面布局插件。提高了代码可重用性、可扩展性和可维护性,同时也增加了开发难度
tiles的特点?
1,可定义重用tiles组件
2,动态装载页面
3,支持国际化
4,能创建可重用模块
Tiles框架是Struts的一个插件。我们可以使用Tiles框架来进行页面布局设计。Tiles框架提供了一种模板机制,它可以将网页内容和布局分离,并允许先创建模板,然后在页面中再插入具体的内容。
一、安装Tiles框架
为了使用Tiles,我们必须首先在struts-config.xml文件中声明Tiles,配置代码如下:
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in>
其中org.apache.struts.tiles.TilesPlugin类只需要设置一个definitions-config属性。这个属性值指向了一个定义文件tiles-defs.xml。这个定义文件的基本格式如下:
<?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">
<!--
This is a blank Tiles definition file with a commented example.
-->
<tiles-definitions>
<definition name="yyy" path="/aaa.jsp">
</definition>
<definition name="base" path="/layout.jsp">
<put name="header" type="page" value="/header.jsp"/>
<put name="content" type="page" value="/content.jsp"/>
<put name="foot" type="page" value="/foot.jsp"/>
</definition>
<definition name="base1" extends="base">//继承
<put name="content" type="page" value="/content1.jsp"/>
</definition>
</tiles-definitions>
其中<tiles-definitions>元素中可以包含多个<definition>子元素。我们还可以将一个定义文件拆成多个定义文件,如A-defs.xml、B-defs.xml和C-defs.xml。在为definitions-config属性赋值时,如果有多个定义文件,中间用逗号(,)分割。如下面的代码所示:
<set-property property="definitions-config" value="/WEB-INF/A-defs.xml, /WEB-INF/B-defs.xml, /WEB-INF/C-defs.xml " />
Tiles框架还有一个定制标签库。我们可以使用如下的taglib指令来声明这个标签库:
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
二、<jsp:include>和<tiles:insert>标签
由于在编写Web程序的过程中,很多页面会出现同样的内容,如所有的页面都使用同样的的页头和页尾。在JSP标签库中提供了一个include标签可以将其他的页面包含到当前的页面中,如我们可以使用如下的代码包含页头和页尾。
<jsp:include page = "header.jsp" />
<jsp:include page = "footer.jsp" />
在Tiles框架的标签库中也提供了一个insert标签。这个标签也可以完成和include同样的工作。如上述代码也可以写成如下形式:
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<tiles:insert page = "header.jsp" />
<tiles:insert page = "footer.jsp" />
虽然include和insert标签都可以很好地解决代码重用问题,但是并不能完全避免代码重复的问题。如很多使用include或insert标签的页面也拥有很多类似或相同的代码。如使用css布局、用table、div等HTML元素进行位置控制等。如果想避免这些代码的重复。光使用include或insert标签是无法做到的。而要想做到这一点,就要使用下一篇文章中介绍的Tiles模板。
相关推荐
### Struts1与Struts2的主要区别 #### 概述 Apache Struts 是一个用于构建企业级Java Web应用的开源框架。它分为两个版本:Struts1 和 Struts2。虽然两者都基于模型-视图-控制器(MVC)设计模式,但它们之间存在...
Struts 2整合Struts 1,允许开发者利用Struts 1已有的投资,同时享受Struts 2带来的优势,如增强的类型安全和更强大的拦截器机制。 在《Struts 2权威指南--基于WebWork核心的MVC开发》这本书中,作者李纲深入浅出地...
Struts1和Struts2是两个非常著名的Java Web框架,它们都由Apache软件基金会开发,用于构建MVC(Model-View-Controller)架构的应用程序。虽然它们在目标上相似,但在设计模式、功能特性和使用体验上存在显著差异。...
Struts1和Struts2是两个不同的版本,它们各自拥有独特的特性和功能,但在Java Web开发领域都扮演了重要角色。 **Struts1** Struts1是最早的版本,它在2001年发布,是基于ApacheJakarta项目的一个框架。Struts1的...
Struts 1.x 是一款基于模型-视图-控制器(MVC)设计模式的Java Web框架,它在早期的Web应用程序开发中占据了重要的地位。本教程主要针对初学者,旨在引导学习者掌握Struts 1.x的基础知识和使用方法。 在开始学习...
Struts1是一个经典的Java Web框架,它为开发者提供了一种结构化的MVC(Model-View-Controller)设计模式实现方式。然而,在Struts1的原生设计中,并没有内置拦截器(Interceptor)这一概念,这与后来的Struts2框架...
Struts1是一个经典的Java Web开发框架,由Apache软件基金会维护,它主要负责处理MVC(Model-View-Controller)架构中的控制器部分。本实验项目旨在帮助开发者深入理解Struts1的核心概念和工作流程,以便更好地在实际...
Struts1和Struts2是两个非常著名的Java Web框架,它们在设计模式、可测试性、输入处理和表现层等方面存在显著的区别。 首先,Action类的设计有所不同。在Struts1中,Action类需要继承一个抽象基类,这限制了Action...
### Struts1与Struts2的主要区别 #### 一、Action执行机制的不同 - **Struts1**: 在Struts1框架中,Action是基于单例模式的,这意味着所有的请求都会共享同一个Action实例。这就导致了如果在Action中保存实例变量...
Struts 1 学习文档 Struts 1 是一个基于 MVC 模式和面向对象设计的 Open Source 项目,由 Apache 基金会 Jakarta 项目组开发。Struts 拥有完整的社区与庞大的用户群体,为企业应用提供了良好的网络环境与充实的人才...
这个压缩包包含了两个关键版本的Struts框架的电子书,即Struts1.x和Struts2.0的相关资料。 **Struts1.x** Struts1.x是最初的Struts版本,它极大地简化了Java Servlet和JSP的应用开发。Struts1的核心概念包括Action...
struts1 和 struts2所需jar包。主要包含以下内容: struts-1.3.10-all.zip struts-1.3.10-apps.zip struts-1.3.10-lib.zip struts-1.3.10-src.zip struts-2.3.4.1-all.zip struts.rar
Struts1是一个经典的Java Web开发框架,它引入了模型-视图-控制器(MVC)设计模式,使得开发者能够更有效地组织和管理Web应用程序。在本样例程序中,我们结合了Struts1与Maven,后者是一个项目管理和集成工具,能够...
Struts2是Struts1的升级版,它在Struts1的基础上引入了许多改进和新特性,提高了开发效率和应用性能。 Struts1是一个经典的MVC框架,它的核心组件包括Action、Form Bean、Action Mapping和Tiles等。Action是业务...
Struts1是一个经典的Java Web开发框架,由Apache软件基金会维护,它基于Model-View-Controller(MVC)设计模式,极大地简化了Java Servlet和JSP的开发。在本项目中,“struts1项目代码”提供了从头到尾的实现,包括...
本部分文档内容主要涉及了Struts1框架的入门级知识和实例应用。Struts1是Apache软件基金会Jakarta项目的一部分,它最初是作为Jakarta Struts项目的一部分引入的,是一个为Java EE平台设计的开源的MVC(Model-View-...
Struts1和Struts2是两个非常重要的Java Web框架,由Apache软件基金会开发,用于构建MVC(模型-视图-控制器)架构的应用程序。它们极大地简化了Web应用的开发,提高了代码的可维护性和组织性。 Struts1是早期的版本...
这里提到的"struts1和struts2相关jar包"分别指的是Struts框架的两个主要版本:Struts 1和Struts 2。 **Struts 1** Struts 1是最早的版本,于2000年发布。它是基于Java Servlet和JSP技术的,旨在解决在JSP应用中控制...
因为最近攻防演练,对公司的资产进行梳理,发现部分应用还使用的struts1框架,所以赶快收集整理了相关的漏洞以及相关的整改方案。提供给大家。
Struts1是一个经典的Java Web开发框架,而Apache POI是一个流行的API,用于处理Microsoft Office格式的文件,包括Excel。在本项目中,"struts1 poi Excel批量导入支持xls和xlsx"是一个基于Struts1和POI实现的功能,...