在配置struts拦截器时,如果除了核心拦截器外还有其他拦截器,其他拦截器需要放在核心拦截器之前。
Struts2中action开发的几种方式
1).继承ActionSupport
package cn.test.user;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//Action中业务逻辑处理方法
public String login(){
return "success";
}
}
2).实现Action接口,重写execute()方法
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
package cn.test.user;
import com.opensymphony.xwork2.Action;
public class UserAction implements Action{
//Action中业务逻辑处理方法
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return "success";
}
}
3).不实现任何接口,也不继承类。
Struts的功能是通过拦截器来实现的,不实现接口或者类,也不会影响到其数据自动封装的功能
package cn.test.user;
import com.opensymphony.xwork2.Action;
public class UserAction implements Action{
//Action中业务逻辑处理方法
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
// TODO Auto-generatedmethod stub
System.out.println(name);
return "success";
}
}
Struts2的通配符
在同一个Action中有多个业务方法返回同一个值或者页面的配置方法
可以使用通配符来配置
<action name="user_*"class="cn.test.user.UserAction" method="{1}">
<result name="success">login.jsp</result>
</action>
*代表uer_之后输入的字符串,被填充到{1}中进行查找,找不到则报错
<action name="user_*"class="cn.test.user.UserAction" method="{1}">
<result name="{1}">{1}.jsp</result>
</action>
通配符可以在struts配置信息中用来优化配置,可以在action中任何一个地方使用。
Struts中路径匹配原则:
访问路径 = 协议+主机名+端口号+应用程序名 + 名称空间 + 对外访问路径
如果没有名称空间,默认为/
Struts2访问路径解析
Struts2项目访问路径http://localhost:8080/struts02/user/a/b/user_login在服务器上的解析过程
服务器
查看协议:http
解析主机:localhost
解析端口号:8080
解析访问的项目资源名称:struts02
解析出要访问的资源名称:user_login
查看名称空间:user/a/b是否存在,如果不存在这个名称空间,则继续向下找
如果存在,则在该名称空间中查找名字为user_login的action
查看名称空间:user/a 是否存在,如果不存在这个名称空间,则继续向下找
如果存在,则在该名称空间中查找名字为user_login的action
查看名称空间:user 是否存在,如果不存在这个名称空间,则继续向下找
如果存在,则在该名称空间中查找名字为user_login的action
查看名称空间:/ 如果还没有找到,就报错。
如果存在,则在该名称空间中查找名字为user_login的action
如果找到其中一个对应的名称空间,则返回,并获取类来响应用户的请求。
Struts中的常量
Struts的默认访问后缀名:
Struts1中默认访问后缀名是:*.do;
Struts2中默认访问后缀名是:*.action;
编码之前,必须知道编码规则。
修该struts的访问后缀
1. struts2的.action后缀定义在哪里?
Struts-core-2.3.4.1.jar/org.apache.struts/default.properties
2. 修改struts2的访问后缀
<constant name="struts.action.extension"value="action,,"></constant>
多个访问后缀名称之间用英文逗号隔开
一般来说,任何一个框架的常用配置文件,都会放在其包文件的根目录下或者第一个包目录中。对于所有应用都是用的配置,一般会放在全局变量中。
其他常量:
指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
<constant name="struts.i18n.encoding"value="UTF-8"/>
自定义后缀修改常量
<constant name="struts.action.extension"value="do"/>
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
<constant name="struts.serve.static.browserCache"value="false"/>
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
<constant name="struts.configuration.xml.reload"value="true"/>
开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true"/>
默认的视图主题
<constant name="struts.ui.theme" value="simple"/>
与spring集成时,指定由spring负责action对象的创建
<constant name="struts.objectFactory"value="spring" />
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性
为 false
<constant name="struts.enable.DynamicMethodInvocation"value="false"/>
上传文件的大小限制
<constant name="struts.multipart.maxSize"value=“10701096"/>
Struts2动态方法的调用:
<!—-开启动态方法的调用-->
<constant name="struts.enable.DynamicMethodInvocation"value="true"></constant>
<!—-在总配置文件中引入其他struts文件-->
<include file="/cn/test/user/config/actionstruts.xml">
</include>
在struts访问路径中,如果出现两个相同的访问路径,后面的访问路径会覆盖前面的访问路径。
<!-- 动态方法调用
访问方式:
http://localhost:8080/struts02/user!login
协议://主机名:端口号/项目名/actionName!需要访问的方法
-->
<action name="user"class="cn.test.user.config.UserAction" >
<result name="success">login.jsp</result>
</action>
不建议使用动态方法调用
全局配置的常量,应该单独放在一个struts文件中去配置和维护,在总配置文件中引入这个文件即可。
全局视图
对于多个action返回同一个结果,也可以同过全局视图的方式配置来跳转结果。
<global-results>
<result name="success">/success.jsp</result>
</global-results>
在返回同一个结果的action中,不必再配置这个跳转结果。如果在某一个action中配置了跳转结果,则会覆盖全局视图配置的跳转结果。在查找跳转结果是,会先查找action中配置的跳转结果,如果当前action没有配置,则会到全局视图中去查找对应的页面,如果全局视图中也没有找到跳转结果配置,则会报错。
全局视图的配置,必须在action配置之前。
配置各项默认值
1. 在struts的action中默认执行的业务逻辑方法是execute()方法
<action name="login"
class="cn.test.action.HelloAction" >
</action> 中method的默认值是execute
2.action中没有配置class时,默认值为com.opensymphony.xwork2.ActionSupport
<action name="login">
</action>
执行的是action在struts-default中的配置
<default-class-ref calss=”com.opensymphony.xwork2.ActionSupport”/>
默认执行的方法是execute()方法,返回值为success,对应的页面在全局视图配置中去找。
重定向跳转不到项目的web-inf目录下的资源。但是转发可以跳转到web-inf目录下的资源。
Web-inf中放置的是资源文件,一般不允许客户直接访问。
在action中可以通过type来配置转发或者重定向。
什么情况下不配置action的class?
答案:当只是需要跳转到web-inf下的资源时,可以不配置class。type的默认值为forward