Struts2的Action的编写方式
1)、不实现任何的接口,也不需继承任何的类
2)、实现了Action的接口
使用这种方式给Action提供了一个默认的execute方法,给Action提供了一个一些开发中常用的视图字符串
3)、继承了ActionSupport类
ActionSupport类实现了Action接口,所以拥有了Action中的所有功能,同时还提供了表单数据验证,国际化等功能
Struts2的常量配置:
在Struts2框架中有一个常量文件:default.properties
常见的一些常量配置:
strut.18n.encoding:UTF-8 设置了struts2运行过程中请求参数的编码
struts.multipart.parser:struts2使用的文件上传组件,默认为jakarta,也即是commons-fileUpload
struts.multipart.saveDir:struts2在文件上传过程中的缓存目录
struts.multipart.maxSize: struts2文件上传的总文件大小
struts.action.extension:action,, struts2定义action的访问后缀名称
struts.enable.DynamicMethodInvocation : 设置struts2的动态方法调用机制,为了方便action的方法测试,struts2提供了动态方法调用机制
在struts2中设置参数:
在struts.xml的action中设置param属性:name为参数的名称,后面接参数的值
<param name="savePath" >C:/exam/</param>
同时还要在action中设置属性,并提供set方法
三、
拦截器
拦截器是struts2自身的一种技术。用于拦截action的(访问前后)
编写一个类,继承MethodFilterInceptor,或者实现Interceptor接口,并实现里面的doIntercept方法
进去到拦截器并执行完拦截器的方法后,需要放行 invocation.invoke()走被拦截器拦截后的action方法,最后走拦截器后面的方法
在struts.xml文件中先定义拦截器,再使用拦截器
注意事项:
1、在struts2中推荐使用的是拦截器栈
2、<default-interceptor-ref name="defaultStack" />默认拦截器引用,当前包下面的所有action都会引用这个拦截器
1)、不实现任何的接口,也不需继承任何的类
/**
* action的方式一,直接创建一个类,不需继承类和实现接口
* @author Mao
*
*/
public class Demo2 {
public String list(){
System.out.println("list");
return "list";
}
}
2)、实现了Action的接口
使用这种方式给Action提供了一个默认的execute方法,给Action提供了一个一些开发中常用的视图字符串
import com.opensymphony.xwork2.Action;
/**
* action的创建方式三:实现Action接口,里面需要实现execute方法
* 功能和继承actionSupport差不多,不过没有actionsupport里面的方法和功能多
* @author Mao
*
*/
public class Demo3 implements Action {
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("execute");
return "success";
}
}
3)、继承了ActionSupport类
ActionSupport类实现了Action接口,所以拥有了Action中的所有功能,同时还提供了表单数据验证,国际化等功能
import com.opensymphony.xwork2.ActionSupport;
/**
* action的创建方式二,继承ActionSupport类,比较推荐
* 在继承这个类的情况下,可以拥有比较多的方法,比如数据校验和国际化等
* 默认方法为execute()方法
* @author Mao
*
*/
public class Demo1 extends ActionSupport{
public String list(){
System.out.println("list");
return SUCCESS;
}
}
Struts2的常量配置:
在Struts2框架中有一个常量文件:default.properties
常见的一些常量配置:
strut.18n.encoding:UTF-8 设置了struts2运行过程中请求参数的编码
struts.multipart.parser:struts2使用的文件上传组件,默认为jakarta,也即是commons-fileUpload
struts.multipart.saveDir:struts2在文件上传过程中的缓存目录
struts.multipart.maxSize: struts2文件上传的总文件大小
struts.action.extension:action,, struts2定义action的访问后缀名称
struts.enable.DynamicMethodInvocation : 设置struts2的动态方法调用机制,为了方便action的方法测试,struts2提供了动态方法调用机制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<constant name="struts.action.extension" value="do,action,,"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="demo1" class="b_example.Demo1">
<result name="add">/index.jsp</result>
</action>
</package>
</struts>
在struts2中设置参数:
在struts.xml的action中设置param属性:name为参数的名称,后面接参数的值
<param name="savePath" >C:/exam/</param>
同时还要在action中设置属性,并提供set方法
一、
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Demo1 extends ActionSupport {
/**
* 接收参数的方式一,设置属性,并提供set方法
*/
private String name;
private String email;
public void setName(String name) {
this.name = name;
}
public void setEmail(String email) {
this.email = email;
}
public String list(){
System.out.println("执行了");
System.out.println(name);
System.out.println(email);
return "add";
}
}
二、
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 属性参数注入方式三:使用一个模型驱动,传入一个对象,实现get方法
* 此方法只能获取到一个对象,如果要获取多个对象的方式应该使用方式二设置对象
* @author Mao
*
*/
public class Demo2 extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public User getModel() {
// TODO Auto-generated method stub
return user;
}
public String reg(){
System.out.println("执行了");
System.out.println(user.getName());
System.out.println(user.getEmail());
return SUCCESS;
}
}
三、
import com.opensymphony.xwork2.ActionSupport;
/**
* 属性注入的方式二:通过注入一个对象,并提供getset方法
* 此方式可以注入多个对象
* @author Mao
*
*/
public class Demo3 extends ActionSupport {
//提供一个javabean对象接收参数
private User user;//struts2会自动创建对象
//注意:必须提供getter和setter方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String reg(){
System.out.println("执行了注册方法");
System.out.println(user);
return SUCCESS;
}
}
拦截器
拦截器是struts2自身的一种技术。用于拦截action的(访问前后)
编写一个类,继承MethodFilterInceptor,或者实现Interceptor接口,并实现里面的doIntercept方法
进去到拦截器并执行完拦截器的方法后,需要放行 invocation.invoke()走被拦截器拦截后的action方法,最后走拦截器后面的方法
在struts.xml文件中先定义拦截器,再使用拦截器
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class filterAuthIn extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation in) throws Exception {
ActionProxy proxy = in.getProxy();
String method = proxy.getMethod();
if(method.equals("user_login") || method.equals("type_list")){
return in.invoke();
}
Object object = ServletActionContext.getRequest().getSession().getAttribute("loginInfo");
if(object==null){
return "login";
}
return in.invoke();
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.i18n.encoding" value="utf-8" />
<package name="default" namespace="/" extends="struts-default">
<!-- 拦截器的定义,建议使用拦截器栈即可,在自定义拦截器栈中第一个要放默认栈defaultStack -->
<interceptors>
<interceptor name="mystack1" class="d_example.Intertecor"></interceptor>
<interceptor-stack name="MyStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="mystack1"></interceptor-ref>
</interceptor-stack>
</interceptors>
</package>
<package name="login" namespace="/login" extends="struts-default">
<interceptors>
<interceptor name="myinter" class="d_example.filterAuthIn"></interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myinter"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<action name="user_*" class="d_example.UserAction" method="{1}">
<result>/list.jsp</result>
</action>
<action name="type_*" class="d_example.TypeAction" method="{1}">
<result>/add.jsp</result>
</action>
</package>
</struts>
注意事项:
1、在struts2中推荐使用的是拦截器栈
2、<default-interceptor-ref name="defaultStack" />默认拦截器引用,当前包下面的所有action都会引用这个拦截器
3、如果action中使用了局部拦截器引用(<interceptor-ref name="myStack"></interceptor-ref>),会覆盖全局的拦截器引用
如图是一个struts2的工作流程
通过今天的学习对struts2框架的认识又在加强了一步