1:配置struts.xml文件的路径,如:将文件放在conf文件夹下面,conf/struts.xml,在web.xml中配置
<!--按顺序加载,不能颠倒struts-default.xml,struts-plugin.xml,conf/struts.xml-->
配置方法:
<!-- 支持struts路径 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- 配置默认加载项及struts.xml路径,按顺序加载 -->
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,conf/struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2:struts.xml配置
1: 以包开始<package></package>,其中第一个包必须继承extends="struts-default",其余之后的包,可以继承自定义包,但最终目的还是要继承struts-default
<package name="自定义名称" extends="struts-default" namespace="自定义命名空间,如果不定义,则默认为"" 或"/",如果命名空间为/a/b/c/...则查询其指定的内容是,从内向外查找,及先从最里面c开始,逐次向外查找 ">
2:定义action
<action name="与jsp页面提交的action名称相同,其省略后缀".action" ,只保留名称,如:在jsp页面中的提交方法为add.action,在这儿的name就是add"
class="将要映射的类,及要处理数据的类的全路径,包名+类名,如:cn.it.AnimalAction,如果不写,则默认是ActionSupport"
method="在类中处理的方法,如:类中有方法 public String add(){},则这儿的method="add",如果不写默认为"execute",即表示在类中有这个 public String execute(){}方法,">
<!--各项默认值-->
1>如果没有为action指定class,默认是ActionSupport。
2>如果没有为action指定method,默认执行action中的execute() 方法。
3>如果没有指定result的name属性,默认值为success。
3:定义方法返回结果
<result name="方法的返回值,如add方法的返回值,如果不写,则表示默认值:success"
type="页面的转发类型:dispatcher--表示使用请求转发的方式跳转;
chain -- 表示使用请求转发的方式跳转到其它的Action中;
redirect--表示使用重定向的方式跳转;
redirectAction--表示使用重定向的方式跳转到其它的Action中;
plainText -- 把jsp的源代码显示出来
其不写,则默认为dispatcher">要跳转的页面</result>
<!--显示源代码-->
<result name="jsp" type="plainText">
<param name="location">/index.jsp</param>
</result>
<!-- 设置XXXAction的固定参数xxx为yyy ,在后台获取-->
<param name="xxx">yyyy</param>
<!--通过url可传参数-->
<result type="redirect">/ok.jsp?pwd=${userPwd}</result>
<result name="filed" type="redirectAction">
4:不同的action之间跳转:只有type为 chain 与 redirectAction
在跳转之前确定result要转向的Action所在的包的位置,即<package name=""....></package>
<param name="如果在相同包中,则不需要设置namespace,如果不在同包中,则需要配置namespace">a</param>
<param name="actionName">到别的包中action,如insert</param>
</result>
</action>
</package>
3:配置公共结果类型
<package name="default" extends="struts-default">
1:以<global-results>开始
<global-results>
<result name="方法返回值">公共页面</result>
<result name="ok">/ok.jsp</result>
<result name="no">/no.jsp</result>
<result name="error">/error.jsp</result>
</global-results>
2:配置错误信息页面
<global-exception-mappings>
<exception-mapping result="对应错误信息的返回结果,如:error"
exception="对应错误类型的类,如IO流异常等">
<!--针对运行时异常:编译器不强作处理,及其子类:如:空指针、下标越界、sql异常、类匹配异常、数字转换错误、参数异常等-->
</exception-mapping>
<exception-mapping result="error" exception="java.lang.Exception">
</exception-mapping>
</global-exception-mappings>
<!--配置通用的跳转-->
<action name="index" class="ActionSupport(默认,可不写)">
<result type="redirectAction">
<param name="actionName">方法名(mypage)</param>
<param name="namespace">别的namespace(user) </param> -->
</result>
</action>
</package>
4:继承公共类,用于自己的业务,通配符的用法,通配符用* 表示,其方法代词{1}表示,如有多个通配符,如:user_*_*_name,则其代词为{1},{2},其中{1}表示第一个通配符的内容,{2}表示第二个通配符的内容
struts2中不能出现相同的命名空间,
在当前包中找不到XX.action 时,自动跳转到通用配置
<!-- 自己的各种业务package -->
<package name="userpkg" extends="default" namespace="/user"> --->extends="default" 继承了公共包
<action name="useraction_*" method="{1}"
class="org.ycpower.struts.actions.UserAction">
<result>/{1}ok.jsp</result>
</action>
<action name="*"> ---> 由于公共的跳转中mypage在此namespace中不存在,通配符统配
<result>/{1}.jsp</result> ---> {1}代词,表示内容可通配符*的内容一样
</action>
</package>
5:配置各种常量
<!--配置方法后缀为.action或do,多个时,中间用","号分割-->
<constant name="struts.action.extension" value="action,do" />
<!-- value为true,支持动态方法,false时,不支持,默认false,主要针对使用"!"的动态方法,与通配符的无关系 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 打印更多的错误信息,开发模式下打开,生产环境下关闭 -->
<constant name="struts.devMode" value="true" />
<!-- struts的配置文件修改后,系统是否重新加载该文件,默认值为false,生产环境下使用,开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!--指定web的默认编码模式,设置请求编码,只是针对与post方式的编码,-->
<constant name="struts.i18n.encoding" value="utf-8" />
<!--设置浏览器是否缓存静态内容,默认为true(产品(生产)模式使用),开发环境下关闭-->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 默认的视图主题,simple表示自己设置,不适用提供的主题 -->
<constant name="struts.ui.theme" value="simple" />
<!-- 指定处理文件上传:MIME-type:multipart/form-data -->
<constant name="struts.multipart.parse" value="cos/pell/jakarta" />
<!--指定上传文件时的临时目录,默认使用javax.servlet.context.tempdir-->
<constant name="struts.multipart.saveDir" value="/tempuploadfiles" />
<!--指定struts2文件上传中整个请求内容允许的最大字节数-->
<constant name="struts.multipart.maxSize" value="2097152' />
<!-- 指定struts2应用加载时自定义的属性文件,该自定义属性文件指定的属性不会覆盖struts。properties文件中指定的属性,
如果需要加载多个自定义属性文件,多个自定义属性文件的文件名以","隔开,即:不该写struts.properties -->
<constant name="struts.custom.properties" value="application,org/apache/struts2/extension/custom" />
<!-- 设置是否可以在action中使用斜线,默认false,需要时设置为true ,用于命名空间-->
<constant name="struts.enable.SlashesInActionNames" value="true" />
<!-- 设置要加载的国际化资源文件,以逗号分割-->
<constant name="struts.custom.i18n.resources" value="application" />
<!--设置struts自动加载文件列表,默认加载文件列表,可更改路径-->
<constant name="struts.configuration.files" value="struts-default.xml,struts-plugin.xml,struts.xml" />
5:模型驱动和属性驱动
1:属性驱动:其义就是:在Action中直接放置箱子(model),调用封装类,采用封装类的get/set方法,在jsp页面上的name用A.name模式,其A的实际值封装类的get方法
的变形。即:实体作为另一个实体的属性
如:有一个DogModel,在PetAction中
public class PetAction(){
private DogModel dogModel;
public String add(){
Dog
}
public DogModel getDogModel(){
return dogModel;
}
public DogModel setDogModel(DogModel dogModel){
this.dogModel=dogModel;
}
}
在jsp页面
<form action="add.jsp" method="post">
<input name="dogModel.dogName" type="text" value="" />
</form>
2:模型驱动:直接放箱子
如:有一个DogModel,在PetAction中
public class PetAction() implements ModelDriven<DogModel>{
DogModel dogModel = new DogModel();
public String add(){
}
@override
public dogModel getModel(){
return dogModel;
}
}
jsp页面:
<form action="add.action" method="post" >
<input type="text" name="dogModel" value="" />
<input type="submit" value="GO" />
</form>