Struts2配置
目录
Struts2文件加载顺序
注:Struts 2.0版本的核心控制器为org.apache.struts2.dispatcher.FilterDispatcher
2.1.3之后FilterDispatcher 不推荐使用,而被StrutsPrepareAndExecuteFilter
struts.xml
核心配置文件,主要负责管理Action
通常放在WEB-INF/classes目录下,在该目录下的struts.xml文件可以被自动加载
Struts.Xml的配置
constant常量配置
包
常量配置,推荐在struts.properties中进行配置,如我们常写的配置有一下几个。
Ø struts.action.extension=action
Ø struts.custom.i18n.resources= msg
Ø struts.i18n.reload = true
Ø struts.configuration.xml.reload = true
Ø struts.devMode = true
配置方式1:<constant name="struts.action.extension" value="action"></constant>
配置方式2:在src下创建struts.properties文件 struts.action.extension=action
package元素
包的作用:简化维护工作,提高重用性,组织功能模块
包可以“继承”已定义的包,并可以添加自己包的配置
name属性为必需的且唯一,用于指定包的名称
extends属性指定要扩展的包
namespace属性定义该包中action的命名空间 ,为可选属性
namespace命名空间
该参数在struts的package中,对整个包中的访问添加命名空间
<package name="default" namespace="/ " extends="struts-default">
<action name="helloWorld" class="base.HelloAction">
<result name="success">/hello.jsp</result>
</action>
</package>
如果使用以上命名空间访问action helloWorld需要通过路径:
http://localhost:8080/web应用名称/helloWorld
如果把配置文件改为
<package name="default" namespace="/n1 " extends="struts-default">
<action name="helloWorld" class="base.HelloAction">
<result name="success">/hello.jsp</result>
</action>
</package>
那么访问路径应该改为:
http://localhost:8080/web应用名称/n1/helloWorld
至于extends属性,如果没有特殊原因一般的值都是struts-default
Action元素的配置
Action类的作用:
封装工作单元
数据转移的场所
返回结果字符串
Action标签中class属性可以省略,省略后,服务器会把请求交由ActionSupport处理,默认返回”success”
<action name="classTest">
<result>/hello.jsp</result>
</action>
method属性
实现Action中不同方法的调用
<action name="zhuceXml" class="base.ZhuceXmlAction" method="zhuce">
<result name="success">/loginsuccess.jsp</result>
<result name="input">/zhuce.jsp</result>
</action>
动态方法调用
作用:减少Action数量
使用:actionName!methodName.action
禁用:将属性struts.enable.DynamicMethodInvocation设置为false
Action代码:
public class HelloAction implements Action{
@Override
public String execute() throws Exception {
return "success";
}
public String test1(){
System.out.println("使用动态方法调用");
return "success";
}
}
Struts.xml配置
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="helloWorld" class="base.HelloAction">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
访问路径 http://localhost:8080/web应用名称/helloWorld!test1.action
通配符(*)的使用
另一种形式的动态方法调用
Struts.xml
<action name="*user" class="base.UserAction" method="{1}">
<result>/{1}success.jsp</result>
<result name="fail">/{1}.jsp</result>
</action>
*代表任意个字符
{1}就是第一个*的值
访问http://localhost:8080/web应用名称/loginuser
访问UserAction中的login方法
成功:返回loginsuccess.jsp
失败:返回login.jsp
访问http://localhost:8080/web应用名称/reguser
访问UserAction中的reg方法
成功:返回regsuccess.jsp
失败:返回reg.jsp
配置默认Action
没有Action匹配请求时,默认Action将被执行
通过<default-action-ref … />元素配置默认Action
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="defaultAction">
</default-action-ref>
<action name="defaultAction">
<result>/404.jsp</result>
</action>
<!—省略其他-->
</package>
效果:如果访问action不存在,则跳转到404.jsp页面
多配置文件
serlvet如果采用配置文件去配置,我们会发现,如果servlet类写的太多了,web.xml文件会很庞大。没有一个很好的区分方。Struts就解决了这个问题
Struts框架,可以写很多配置文件,这些配置文件在运行时,也可以采用多种方式整合到一起。struts默认只会读取classpath下的struts.xml这个配置文件。
我们可以把所有自己写的struts配置文件,采用包导入的方式,导入到系统默认读取的struts.xml配置文件中。如:下面有三个strust的配置,但是,系统只读struts.xml
在struts.xml文件中,采用下面方法整合
<include file="struts-news.xml"></include>
如果配置文件在某个包下面,导入方法为:
<include file="com/yinhe/struts/xml/struts-news.xml"></include>
注:如果使用include引入xml文件,注意包含的文件中package标签的名称不要重复
全局返回结果和局部返回结果
直接在action标签的外部写的result称为全局返回结构,该返回结果可以给所有的action使用。如果既有全局返回结果又有局部返回结果,在该action中,以局部返回结果为主。
全局返回记过声明代码如下:
<global-results>
<result name="error">/error.jsp</result>
</global-results>
注:global-results和default-action-ref标签不要同时出现在同一个package下,不然会报错
Result配置
<result name=”” type=””></result>
如果name不填,默认那么的值为”success”
如果type不填,默认type的值为“dispatcher”
Type属性常见值
dispatcher类型
默认结果类型,后台使用RequestDispatcher转发请求 (转发到jsp)
redirect类型
后台使用的sendRedirect()将请求重定向至指定的URL (重定向到jsp)
<result name="success" type="redirect">/loginsuccess.jsp</result>
redirectAction类型
主要用于重定向到Action (重定向到action)
<action name="login" class="base.LoginAction">
<result name="success" type="redirectAction">listuser</result>
<result name="fail">/login.jsp</result>
</action>
如果带参数
<action name="login" class="base.LoginAction">
<result name="success" type="redirectAction">
<param name="actionName">listuser</param>
<param name="msg">i love java</param>
<param name="namespace">/</param>
</result>
<result name="fail">/login.jsp</result>
</action>
或者缩写方式
<action name="login" class="base.LoginAction">
<result name="success"
type="redirectAction">listuser.action?msg=hi</result>
<result name="fail">/login.jsp</result>
</action>
或者可以使用ongl表达式传值
<action name="login" class="base.LoginAction">
<result name="success"
type="redirectAction">listuser.action?msg=${uname}</result>
<result name="fail">/login.jsp</result>
</action>
struts的两种驱动:属性驱动;模型驱动
属性驱动
直接在action中声明一些属性,然后生成get/set方法的方式,称为属性驱动,
如:在loginAction类中写上
使用属性驱动封装对象action 代码
public class UserAction extends ActionSupport{
UserService us=new UserService();
private ArrayList<User> al;
private String msg;
private User user;
public String add(){
us.add(user);
return "addsuccess";
}
public String list(){
al=us.list();
System.out.println(msg);
return "success";
}//省略get/set方法(包括user对象的)
}
Jsp代码
<form action="adduser" method="post">
用户名:<input type="text" name="user.uname"/><br/>
密码:<input type="text" name="user.psw"/><br/>
手机号:<input type="text" name="user.phone"/><br/>
<input type="submit" value="新增"/><br/>
</form>
模型驱动
先写一个普通的action类,然后实现一个ModelDriven接口,在这个接口中直接把你的User让入泛型中,在生成一个getModel方法,这个方法就会返回一个有值的user对象,这个值是在表单调校后,表单的数据被封装在User对象中,由模型驱动把这个对象通过getModel方法带入我们的action类中,我们就可以再我们的逻辑方法中,直接使用该对象的值。
Action
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String login(){
return null;
}
@Override
public UserBean getModel() {
return user;
}
}
Jsp代码
<form action="loginuser.action" method="post">
用户名:<input type="text" name="uname"/><br>
密 码:<input type="password" name="psw"/><br>
<input type="submit" value="登陆"/><br>
</form>