struts.xml中Action的配置详解


上一篇博文我已经基本上讲解了struts.xml的基本配置,但是实际上配置过程最为主要的是action的动态配置。


一、Action的创建方法

   1)实现Action接口

   2)继承ActionSupport类,覆写其中的方法

   3)不继承任何类都可以实现,关键是在struts.xml中进行配置


二、Action动态方法的调用

  在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担

第一种方法:   在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用)

第二种方法: jsp页面中指定你要调用的那个方法

                       <form action=”login!myfun.action”,method=”post”>

                        在客户端请求中进行动态的配置:映射名!方法名.action

这样可以动态的调用action中的myfun方法,就不要在action标签中进行method的配置

第三种方法:使用通配符进行配置(推荐使用:适用情况当一个类中存在较多的响应方法)

在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用


<action name="*user" class="com.zzjmay.action.UserAction" method="{1}">
//这种通配是针对的是同一个action中,响应不同的方法

在jsp页面中调用的时候
<form action="loginuser.action" method="post">
    <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->
    	用户名:<input type="text" name="username" id="username"><br>
    	密     码:<input type="password" name="password" id="password">
    	<br>
    	<input type="submit" value="提交">
    	
    </form>

注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法

     

  通过通配符实现,不同的类响应不同的类中的方法:

<action name=“*_*" class="action.{1}Action" method="{2}">

    <result >/{2}.jsp</result>

</action>

 


三、 Action的动态结果的配置

含义:在实际运行当中,Action类的处理业务的过程中,可能由于业务条件的复杂,会跳转到不同页面,那么为了节省result的配置,我们一般会采用动态结果的配置。其实很像我们在servlet中进行全局的forward的配置。

 

UserAction.java

public class UserAction extends ActionSupport {

    private String nextResult;

    ...

}

 

Struts2.xml

<action name="user" class="action.UserAction">

    <result>/{nextResult}</result>

</action>

 


四、接收用户数据(推荐使用的实现ModelDriven的接口)

     在这篇博客中我只是介绍常用的,并且在实际项目中效率较高的方法。我之所以推荐ModelDriven接口的方法,原因就是可以很好的分离显示界面和业务逻辑的分离(解耦性)。

实现ModelDriven接口

步骤:

u    实现用户登录功能

u    创建User.java类

Ø          声明用户登录信息

Ø          创建无参构造

u   创建Action类

Ø          实现com.opensymphony.xwork2.ModelDriven接口

Ø          声明User类对象并实例化

Ø         实现getModel ()方法,返回User类对象

u    创建JSP页面

Ø         表单元素使用”属性”设置name属性

注意:

1)  首先,action要实现ModelDriven的接口,默认实现getModel()方法

2)  要在action中自己来实例化user的对象,而不像前面一种方法是有struts2的框架实现的

3)  比较突出的就是在jsp页面中,表单元素的name属性,直接用名字就可以来

UserAction.java

public class UserAction implements ModelDriven<User>  {
	//要实例化
	private User user=new User();
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	public String myfun() throws Exception {
		System.out.println("username="+user.getUsername());
		System.out.println("password="+user.getPassword());
		System.out.println("myfun.....");
		//用来进行处理
		if(user.getUsername().equals(user.getPassword())){
			return "success";
		}else{
			return "error";
		}
		
		
	}

	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	
	

}
login.jsp

<form action="loginuser.action" method="post">
    <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->
    	用户名:<input type="text" name="username" id="username"><br>
    	密     码:<input type="password" name="password" id="password">
    	<br>
    	<input type="submit" value="提交">
    	
    </form>

五、在Action中访问Servlet API

   访问Servlet API的实际项目中有两种的方法访问Servlet API

     1)解耦的方法(实现三大接口程序RequestAware,ApplicationAware,SessionAware)

public class UserAction2 implements ModelDriven<User> ,RequestAware,SessionAware,ApplicationAware{

	private User user = new User();
	
	private Map<String, Object> requestMap;
	private Map<String, Object> sessionMap;
	private Map<String, Object> applicationMap;
	
	
	public void setApplication(Map<String, Object> applicationMap) {
		this.applicationMap=applicationMap;
		
	}

	public void setSession(Map<String, Object> sessionMap) {
		this.sessionMap=sessionMap;
	}

	public void setRequest(Map<String, Object> requestMap) {
			this.requestMap=requestMap;
		
	}


	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String myfun() throws Exception {
		System.out.println("username=" + user.getUsername());
		System.out.println("password=" + user.getPassword());
		System.out.println("myfun2.....");
		// 用来进行处理
		if (user.getUsername().equals(user.getPassword())) {

			sessionMap.put("Succ", "成功的哇2!!!");
			Bookbiz bookbiz=new Bookbiz();
			
			applicationMap.put("books",bookbiz.getBooks());
			
			return "success";
		} else {

			requestMap.put("errorMsg", "登陆失败了2");
			return "error";
		}

	}


	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}

注意:在非解耦的方式中,struts2框架已经将对应的四大应用作用域给封装到了Map集合中,所以这里一开始定义的三个Map集合中可以相当于操作四大作用域对象


     2)非解耦的方法(实现两大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是说直接操作的Servlet API对象

    

public class UserAction4 implements ModelDriven<User>,ServletRequestAware,ServletContextAware{

	private User user = new User();
	
	private HttpServletRequest request;
	private HttpSession session;
	private ServletContext application;

	public void setServletContext(ServletContext application) {
		this.application = application;

	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;

	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
………………

注意:在实现接口中只实现了request和application的获取

在实际项目开发当中,需要的获取session的方法是通过Httpsession session= request.getsession();


    


   





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值