javaee之struts2框架加强学习

Struts2的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框架的认识又在加强了一步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值