1、配置struts
* 拷贝struts/lib文件夹下的所有的jar包到WEB-INF/lib下
* 修改web.xml文件,配置ActionServlet(把下面代码添加到web.xml下)
<!-- Standard Action Servlet Configuration -->
<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> //跟文件名struts-config.xml有关,可有可无
</init-param>
-->
<!-- 如果>=0,表示Tomcat在启动时就初始化ActionServlet -->
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
* 创建struts-config.xml文件(放到WEB-INF文件夹下)
基于struts的web应用的开发步骤
1,对应用环境进行配置
2,创建web应用的结构,需要将struts应用的jar文件进行部署。
3,在web服务器部署struts
4,配置struts-config.xml文件,配置Actoin
5,写自定义Action,实体,以及业务类
★ 不要在Action中进行业务逻辑的处理,业务逻辑应交给专门的Model层去做
在业务逻辑层抛出异常,在Action中捕获和处理
六、struts的html标签
struts的html标签的使用类似于html标签,但是少有区别,指定类型的方式变成使用不同的标签,这样会绑定struts,所以旨在需要时使用。
<html:form method="post" action="/basic-validate/login">
<!--
struts的html标签中的action可以只写转到的actionpath,struts会在解析是自动添加需 要的部分
-->
<html:text property="userName" />
<html:password property="password" redisplay="false"/>
<!--redisplay="false"不进行回写,只有html:password标签可用-->
<html:radio property="hibbos">
<html:submit value="login" />
</html:form>
自动产生HTML文件的内容
使用这样的标签,必须使用ActionForm
七、消息标签
<bean:message key="errors.username.required">这个标签可以从指定的资源文件中根据指定的key值来取得可以对应的值,但是需要在
struts-config.xml中进行配置。
配置资源,这些资源可以在ActionMessage中使用,也就是在构造ActionMessage是指定资源文件中的key这样,在发现校验错误时,就可以
先在资源文件中指定的key的值了。可以使用struts的<html:errors>
<html:message>、<bean:message>标签都可以显示指定错误的消息。
<struts-config>
.....
<message-resources parameter="alan.struts.message.MessageResource" />
<!--使用message标签时配置资源文件的位置-->
</struts-config>
DispatchAction类
(org.apache.struts.actions.DispatchAction)
DispatchAction类是Action类的子类,他提供了有实现的execute方法。
我们写的自定义Action类,可以继承DispatchAction类,但不要覆盖execute方法,可以在自定义类中写反回值和参数表都与execute方法相同的方
法,可以通过在struts-congfig.xml中为这个action的配置中添加一个参数,来判断调哪一个方法,实际上DispatchAction类就是通过反射机制,
通过form中参数调用了自定义Action中的方法,当然这些方法的定义要符合规范,使用继承DispatchAction类的自定义的Action类,也就会共享同
一的Action路径。
注意:使用继承DispatchAction类的自定义的Action,只会匹配一个action路径,只能共享一个ActionForm,如果加上校验,会产生form表单的参数不一致的情况,会导致校验无法通过。
例:
public class MyAction extends DispatchAction{
ActionForward add(ActionForm form,HttpServletRequest request,HttpServletResponse response, ActionMapping mapping) throws Exception
{
return mapping.findForward("sucess")
}
}
<action path="/add" type="MyAction" parameter="methodName">
<!--parameter属性是和form中隐藏域的名字相对应的-->
<forward name="sucess" path="/sucess.jsp"/>
</action>
<from action="add.do" method="post">
<input type="hidden" name="methodName" value="add"/>
<!--
使用隐藏域为struts传递要调用自定义Action中方法的方法名,是通过与struts-config.xml
中action标签中的parameter和name属性相对应来获取隐藏域的value。
-->
<input type="submit" value="submit"/>
</from>
LookupDispatchAction
(org.apache.struts.actions.LookupDispatchAction)
LookupDispatchAction类也是DispatchAction类的子类,他所实现的功能是解决一个表单多种提交问题的
,他是通过使用资源文件,用submit按钮的value来作为资源文件中的key所对应的值,通过这个值来找到对用的key,在使用这个key来获得指定Map中所对应的值,这个值就是要调用的方法名。
submit的value---->MessageResource.properties中的key----->Map中key对相应的值---->action
例:
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<form method="post" action="${pageContext.request.contextPath}/lookup/adddel.do">
<input type="submit" value="<bean:message key="button.add" />" name="methodName">
<!--注意name="methodName"是和strut-config.xml中action标签中的parameter属性-->
<input type="submit" value="<bean:message key="button.delete" />" name="methodName">
</form>
MessageResource.properties
button.add=add new user
button.delete=delete user
注意:在继承LookupDispatchAction时,要覆盖getKeyMethodMap()方法,并定义Map,向Map中放入指定的键值对。
public class AddDelLookupDispatchAction extends LookupDispatchAction
{
public Map getKeyMethodMap(){
Map keyMethodMap= new HashMap();
keyMethodMap.put("button.add", "add");
keyMethodMap.put("button.delete", "delete");
return keyMethodMap;
}
public ActionForward add(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception
{
return mapping.findForward("add");
}
public ActionForward delete(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception
{
return mapping.findForward("delete");
}
}
<action path="/lookup/adddel" type="alan.struts.actions.AddDelLookupDispatchAction"
parameter="methodName">
<forward name="add" path="/add.jsp"/>
<forward name="delete" path="/delete.jsp" />
</action>
<message-resources parameter="alan.struts.message.MessageResource" />
自定义的Action类的一些规则
1,尽量不要在Action类中使用(静态)成员变量,如果使用要加上同步。
2,尽量使各模块间的耦合性降低,最大限度的针对接口编程。
3,可以将共代码方在覆盖父类的方法中,最后可以用super.xxx(xxx)来调用父类的方法,使用父类的实现,并加上了自定义的功能。
1、动态ActionForm的编写:
动态ActionForm是为了避免过多的ActionForm类膨胀而设计的,使用动态ActionForm可以获得标准ActionForm的所有功能
* 在Struts-config.xml配置动态AcitonForm
<form-beans>
<form-bean name="dynaActionForm" type="org.apache.struts.action.DynaActionForm" >
<form-property name="name" type="java.lang.String"/> <!-- name属性要和表单中的name一致 -->
<form-property name="age" type="java.lang.Integer"/> <!-- 必须用包装类 -->
</form-bean>
</form-beans>
* 在Action中使用动态ActionForm,需要强制转换为DynaActionForm类型,同时使用get方法来获取
如:
DynaActionForm dynaform = (DynaActionForm)form;
String name = (String)dynaform.get("name");
Integer age = (Integer)dynaform.get("age");
动态ActionForm其实是把html页面中元素的值放到了map中,所以可以通过get方法取得
动态ActionForm采用EL表达式的输出方式: ${dynabean.map.prop}
----------------------------------------------------------------------------------------------------------------------
2、采用struts上传文件
* 页面中form的配置,如:<form action="upload.do" method="post" enctype="multipart/form-data">
* ActionForm中使用FormFile来接收上传文件,参见:UploadActionForm.java
* 在Action中调用FormFile即可取得上传文件的相关数据,采用流进行输出,完成上传,参见:UploadTestAction.java
注意:对文件上传大小的配置:<controller maxFileSize="10M"/>
----------------------------------------------------------------------------------------------------------------------
3、空字段处理
* 如果html页面中没有写<input>,用jsp脚本接收到的字符串为null,如果用EL表达式,则为空串""
* 如果html页面中存在<input>,但没有输入值,那么JSP脚本和EL表达式输出的都是空串
----------------------------------------------------------------------------------------------------------------------
4、Struts对ActionForm类型的自动转换:
boolean: yes,y,1,true,on这些都可以转换为true类型,而且是忽略大小写的;其它情况会转换为false类型
Date类型转换
* 如果为java.sql.Date,页面的日期类型必须为yyyy-MM-dd才可以转换
* 如果为java.util.Date,默认情况下struts无法转换,要定义自己的converter来转换
自定义转换器的实现步骤:
* 实现Converter接口,实现convert方法
* 将实现的converter注册,通常情况采用servlet进行注册(也可以采用struts plugin的方式进行注册)
* 注意servlet标签中的<load-on-startup>标签的值必须大于等于0
Struts对ActionForm自动搜集过程
* 将页面数据放到map中,其中map的key为页面中的名称,map中的value为页面中value的值
* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上
* 对于ActionForm中的每一个属性,根据属性的类型调用相应的Converter,然后调用Converter的convert方法,将相应的字符串转换成ActionForm中指定的类型
可以通过BeanUtils.copyProperties(目标对象,源对象) 方法,在ActionForm对象和实体对象之间复制,避免过多的调用get/set方法
ActionForward
1、理解全局ActionForward和局部ActionForward的概念
2、理解redirect的使用
* 设为true时表示执行重定向操作
* 设为false时,表示执行请求转发操作
3、理解动态ActionForward,动态ActionForward可以修改参数
4、不能在代码中更改配置文件的属性
Mapping
1、在struts-config.xml中。每个<action>对应一个ActionMapping实例
2、struts建议最好所有的转向都由Struts来控制
3、理解ActionMapping中forward的含义
4、理解ActionMapping中unknow配置的作用
5、了解采用jstl和struts html标签保持页面数据
Struts国际化
缺省的Locale是由什么决定的 (取决于操作系统),Locale是由国家和语言代码组成的
国际化资源文件是由basename + Locale组成的,如:MessagesBundle_zh_CN.properties
* basename可以是任意合法的字符串
native2ascii的位置和使用方法
* 位置:jdk1.6.0_03/bin/
* native2ascii 输入文件(源文件) 输出文件(目标文件) 如:
native2ascii.exe o.properties MessageBundle_zh_CN.properties
1、struts国际化配置
* 在struts-config.xml中加入:
<message-resources parameter="MessageResources" />
2、提供国际化资源文件,并且采用native2ascii.exe将中文转换为unicode编码
3、在JSP中使用<bean:message key=""/>读取国际化消息文本
4、利用struts默认把Locale放到session中的特性,采用编程方式手动切换语言的设置
String lang = request.getParameter("lang");
Locale currentLocale = null;
if("zh".equals(lang)) {
currentLocale = new Locale("zh","CN");
}
else if("en".equals(lang)) {
currentLocale = new Locale("en","US");
}
//request.getSession().setAttribute(Globals.LOCALE_KEY, currentLocale);
this.setLocale(request, currentLocale);
5、如何创建消息?
区分ActionMessages对象和ActionMessage对象,这两个对象的意义
* ActionMessages是一个集合,把ActionMessage对象add到ActionMessages
ActionMessages messages = new ActionMessages();
ActionMessage msg = new ActionMessage(“key”);<key为资源属性文件中的key>
messages.add(“message_id”,msg)
第一个参数表示本ActionMessage对象在ActionMessages对象中区别于其他ActionMessage对象的标识符
6、如何传递消息?
调用saveMessages(传递普通消息);saveErrors(传递错误消息)方法
7、如何显示消息?
通过<html:messages id="msg" message="true" property="error_1"/>标签来显示消息
* (设成message="true"他就会读message的key上的值, <既可以显示普通消息也可以显示错误消息>)
通过<html:errors/>标签显示错误消息(只能显示错误消息)
Struts异常处理
1、编程式异常
* 截获某个异常
* 创建相应的异常消息
* 传递异常消息
* 转到相应的错误页面
2、<exception path=""/>
⑴.key属性:对应错误提示消息文本的key,需要在资源属性文件中定义
⑵.path属性和<action-mappings input=""/>中input属性的优先级
* 既配了input,又配了path之后,以path为第一优先级
* 没有配path,那么就转向input所指向的页面
⑶.Type属性:需要处理哪种类型的Exception
3、<html:errors/>标签在JSP页面显示错误消息
DispatchAction使用
1. paramter指定的参数不能为execute或perform
2. 了解<action>中的parameter属性
3. 不能覆写execute方法,如果要覆写,必须显式的调用父类的execute方法
4. 了解unspecified方法的含义
转载于:https://blog.51cto.com/13423770746/348307