【SSH2(理论+实践)】--图说Struts2的运行

前几篇文章讨论了有关 Struts2 的核心机制及一些基础,但同时也遗留下了很多问题,这些问题主要是针对 Struts2 的一些使用技巧的,该篇文章将会针对 Struts2 的使用技巧进行讨论,并做一个文件上传和下载的实例。

一、Struts2再温习


         Struts2使用了有半个月的时间了,在使用之余我对Struts2的使用流程做了详细的思考,它的使用流程和它的核心息息相关,所以在介绍Struts2时首先解读了它的核心机制,这里对Struts2的基本内容和使用流程再做一次总结。


    上图是Struts2的基本内容,它的内容其实很少,在开发过程中应用最多的就是Struts强大的标签库和它的Webwork核心,其中Webwork核心是映射的重点,通过在xml中配置Filter来管理请求,将请求内容转化为Struts请求,然后根据请求的action去查找拦截器并执行拦截器中的方法,最后知心action中的方法。

    不过有很多使用的细节需要慢慢的总结,这里就不在一一说明。下图为自己绘制的执行流程图。


        1、当页面发出请求后,将会创建程序池,把HttpServletResponse请求送到程序池中;

        2、查找相应的action,根据表单配置的actionstruts.xml中查找相应的action配置项;

        3、根据struts.xml中配置的action查找相应的拦截器,如果配置有拦截器将会首先执行拦截器中配置的class

        4、然后执行class中的init方法;

        56、如果一个action中配置有多个action,将会根据配置顺序来顺序执行相应的拦截器,拦截器的方法执行完成后最后执行action配置的class中的方法;

        7、如果没有在表单提前指定要执行的方法,那么它会默认执行重写的方法execute()

        8、执行的方法会返回一个字符串,会根据该字符串查找action中配置的result如果有与之匹配的标签,将会跳转到标签中的页面。

 

    这就是在使用struts时整个配置的执行过程,其实很简单,主要理解了struts的映射机制那么它的执行流程是很容易理解的,这种方法谈不上高效,因为它的每个步骤都是使用的字符串名称匹配来完成的映射,它会影响执行的效率,因为在这种匹配工作上数字类型的效率是高于字符串类型的。


 

二、Struts2应用实例


        上文一直在讨论Struts2的理论,理论是用来指导实践的,能够加深对事物的理解程度,另外有些部分的理论也可以通过实践获得,在实践中思考总结,同样可以获知理论。


   2.1 一个form执行多个action


        在程序开发的时候会碰到很多应用问题,其中常用到的当数一个form会有多种提交请求,这时候怎么解决呢?菜鸟可能会使用多添加action的方法来执行请求,但这样会使页面的布局混乱,所以要考虑使用其它的办法,这里提供两种方法。


    2.1.1 使用!为相应的action指定要执行的方法

        这种方法在开发时经常使用,它不但简单而且通俗易懂,这里!可以被理解为“的”,如:login!Method1,可以理解为loginMethod1方法,使用简单并且容易读取。

    具体如下代码:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>Insert title here</title>  
  8. <script type="text/javascript">  
  9.       
  10.     //方法1,定义被拦截的方法的实例  
  11.     function method1(){  
  12.         var form=document.forms[0];  
  13.         form.action="loginaction!Method1";  
  14.         form.submit();  
  15.     }  
  16.       
  17.     //方法2,为按钮2添加不拦截的方法  
  18.     function method2(){  
  19.         var form=document.forms[0];  
  20.         form.action="loginaction!Method2";  
  21.         form.submit();  
  22.     }  
  23.       
  24.     //方法3,为按钮3添加不拦截的方法  
  25.     function method3(){  
  26.         var form=document.forms[0];  
  27.         form.action="loginaction!Method3";  
  28.         form.submit();  
  29.     }  
  30. </script>  
  31. </head>  
  32. <body>  
  33.     <form action="loginaction">  
  34.         用户名:<input type="text" name="username"><br>  
  35.         密     码:<input type="text" name="password"><br>  
  36.         <input type="submit" name="ok" value="按钮1" onclick="method1()">  
  37.         <input type="submit" name="ok1" value="按钮2" onclick="method2()">  
  38.         <input type="submit" name="ok2" value="按钮3" onclick="method3()">  
  39.     </form>  
  40. </body>  
  41. </html>  
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	
	//方法1,定义被拦截的方法的实例
	function method1(){
		var form=document.forms[0];
		form.action="loginaction!Method1";
		form.submit();
	}
	
	//方法2,为按钮2添加不拦截的方法
	function method2(){
		var form=document.forms[0];
		form.action="loginaction!Method2";
		form.submit();
	}
	
	//方法3,为按钮3添加不拦截的方法
	function method3(){
		var form=document.forms[0];
		form.action="loginaction!Method3";
		form.submit();
	}
</script>
</head>
<body>
	<form action="loginaction">
		用户名:<input type="text" name="username"><br>
		密     码:<input type="text" name="password"><br>
		<input type="submit" name="ok" value="按钮1" οnclick="method1()">
		<input type="submit" name="ok1" value="按钮2" οnclick="method2()">
		<input type="submit" name="ok2" value="按钮3" οnclick="method3()">
	</form>
</body>
</html>

        2.1.2使用通配符

          通配符同样也可以实现该功能,struts的通配符使用的星号“*”,它指代任意内容,在需要使用它的地方使用大括号加数字的方式来引用第几个通配符,如:<actionname="*User*" class="com.action.ManagerUser"method="{1}User{2}">,其中{1}指代name属性的第一个“*”的内容,{2}指代name属性的第二个“*”的内容。具体使用方法如下:
       (1)jsp页面代码

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>Insert title here</title>  
  8. <script type="text/javascript">  
  9.       
  10.     //方法1,定义被拦截的方法的实例  
  11.     function method1(){  
  12.         var form=document.forms[0];  
  13.         form.action="loginaction/LoginUser";  
  14.         form.submit();  
  15.     }  
  16.       
  17.     //方法2,为按钮2添加不拦截的方法  
  18.     function method2(){  
  19.         var form=document.forms[0];  
  20.         form.action="loginaction/AddUser";  
  21.         form.submit();  
  22.     }  
  23.       
  24.     //方法3,为按钮3添加不拦截的方法  
  25.     function method3(){  
  26.         var form=document.forms[0];  
  27.         form.action="loginaction/DeleteUser";  
  28.         form.submit();  
  29.     }  
  30. </script>  
  31. </head>  
  32. <body>  
  33.     <form action="loginaction">  
  34.         用户名:<input type="text" name="username"><br>  
  35.         密     码:<input type="text" name="password"><br>  
  36.         <input type="submit" name="ok" value="登陆" onclick="method1()">  
  37.         <input type="submit" name="ok1" value="添加" onclick="method2()">  
  38.         <input type="submit" name="ok2" value="删除" onclick="method3()">  
  39.     </form>  
  40. </body>  
  41. </html>  
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	
	//方法1,定义被拦截的方法的实例
	function method1(){
		var form=document.forms[0];
		form.action="loginaction/LoginUser";
		form.submit();
	}
	
	//方法2,为按钮2添加不拦截的方法
	function method2(){
		var form=document.forms[0];
		form.action="loginaction/AddUser";
		form.submit();
	}
	
	//方法3,为按钮3添加不拦截的方法
	function method3(){
		var form=document.forms[0];
		form.action="loginaction/DeleteUser";
		form.submit();
	}
</script>
</head>
<body>
	<form action="loginaction">
		用户名:<input type="text" name="username"><br>
		密     码:<input type="text" name="password"><br>
		<input type="submit" name="ok" value="登陆" οnclick="method1()">
		<input type="submit" name="ok1" value="添加" οnclick="method2()">
		<input type="submit" name="ok2" value="删除" οnclick="method3()">
	</form>
</body>
</html>

     

       (2)配置的action类,loginAction.java

  1. package com.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class loginAction extends ActionSupport {  
  6.     @Override  
  7.     public String execute() throws Exception {  
  8.         System.out.print("这是执行的execute()");  
  9.         if(this.username.equals("admin") && this.password.equals("admin")){  
  10.             return "success";  
  11.         }else if(this.username.equals("cancel") && this.password.equals("cancel")){  
  12.             return "cancel";  
  13.         }else{  
  14.             return "error";  
  15.         }  
  16.     }  
  17.       
  18.     public void AddUser(){  
  19.         System.out.println("执行方法:AddUser");  
  20.     }  
  21.       
  22.     public void LoginUser(){  
  23.         System.out.println("执行方法:LoginUser");  
  24.     }  
  25.       
  26.     public void DeleteUser(){  
  27.         System.out.println("执行方法:DeleteUser");  
  28.     }  
  29.       
  30. }  
package com.action;

import com.opensymphony.xwork2.ActionSupport;

public class loginAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		System.out.print("这是执行的execute()");
		if(this.username.equals("admin") && this.password.equals("admin")){
			return "success";
		}else if(this.username.equals("cancel") && this.password.equals("cancel")){
			return "cancel";
		}else{
			return "error";
		}
	}
	
	public void AddUser(){
		System.out.println("执行方法:AddUser");
	}
	
	public void LoginUser(){
		System.out.println("执行方法:LoginUser");
	}
	
	public void DeleteUser(){
		System.out.println("执行方法:DeleteUser");
	}
	
}

3struts.xml中的action配置

  1. <package name="manageuser" namespace="/loginaction" extends="struts-default">  
  2.         <action name="*User" class="com.action.loginAction" method="{1}User">  
  3.             <result name="error">error.jsp</result>  
  4.             <result name="success">success.jsp</result>  
  5.         </action>  
  6. </package>  
<package name="manageuser" namespace="/loginaction" extends="struts-default">
    	<action name="*User" class="com.action.loginAction" method="{1}User">
    		<result name="error">error.jsp</result>
    		<result name="success">success.jsp</result>
        </action>
</package>


    上面两种方法配置完成后显示界面如下图:

         


    分别单击三个按钮后执行的结果如下图:



    分别执行了三种方法,证明上面的两种请求分配方法都是很正确的。


结语


        Struts2的使用相较Hibernate来说简单的很,它的基本内容很少,核心也采用的是Webwork,所以在使用时只需要读WebWork了解清楚就可以很快上手开发,它的映射机制也很简单,下篇文章使用Struts2来做一个文件上传和下载的例子。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值