zoukankan      html  css  js  c++  java
  • 【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的映射机制那么它的运行流程是非常easy理解的,这样的方法谈不上高效,由于它的每一个步骤都是使用的字符串名称匹配来完毕的映射,它会影响运行的效率,由于在这样的匹配工作上数字类型的效率是高于字符串类型的。


     

    二、Struts2应用实例


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


       2.1 一个form运行多个action


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


        2.1.1 使用!

    为对应的action指定要运行的方法

            这样的方法在开发时常常使用,它不但简单并且通俗易懂,这里!

    能够被理解为“的”,如:login!Method1,能够理解为loginMethod1方法。使用简单并且easy读取。

        详细例如以下代码:

    <%@ 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。为button2加入不拦截的方法
    	function method2(){
    		var form=document.forms[0];
    		form.action="loginaction!Method2";
    		form.submit();
    	}
    	
    	//方法3,为button3加入不拦截的方法
    	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="button1" onclick="method1()">
    		<input type="submit" name="ok1" value="button2" onclick="method2()">
    		<input type="submit" name="ok2" value="button3" onclick="method3()">
    	</form>
    </body>
    </html>
    

            2.1.2使用通配符

              通配符相同也能够实现该功能,struts的通配符使用的星号“*”,它指代随意内容。在须要使用它的地方使用大括号加数字的方式来引用第几个通配符,如:<actionname="*User*" class="com.action.ManagerUser"method="{1}User{2}">,当中{1}指代name属性的第一个“*”的内容,{2}指代name属性的第二个“*”的内容。

    详细用法例如以下:
           (1)jsp页面代码

    <%@ 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。为button2加入不拦截的方法
    	function method2(){
    		var form=document.forms[0];
    		form.action="loginaction/AddUser";
    		form.submit();
    	}
    	
    	//方法3,为button3加入不拦截的方法
    	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="登陆" onclick="method1()">
    		<input type="submit" name="ok1" value="加入" onclick="method2()">
    		<input type="submit" name="ok2" value="删除" onclick="method3()">
    	</form>
    </body>
    </html>
    

         

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

    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配置

    <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>
    


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

             


        分别单击三个button后运行的结果例如以下图:



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


    结语


            Struts2的使用相较Hibernate来说简单的非常,它的基本内容非常少,核心也採用的是Webwork,所以在使用时仅仅须要读WebWork了解清楚就能够非常快上手开发,它的映射机制也非常easy,下篇文章使用Struts2来做一个文件上传和下载的样例。



  • 相关阅读:
    模型驱动架构探索之游戏引擎设计 (二)开始建模
    模型驱动架构探索之游戏引擎设计 (二)粒度统一
    模型驱动架构探索之游戏引擎设计 (一)
    模型驱动架构探索之游戏引擎设计 (序)
    时隔几年,再写传统的简单问题算法,又有何不同?
    【自学笔记】0基础自学机器学习 (第三天)
    【自学笔记】0基础自学机器学习 (第二天)
    JavaSE-知识点总结
    Java框架之SpringBoot 09-Web构建-yml-模块-注解
    Java框架之SpringSecurity 08-权限系统
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7252055.html
Copyright © 2011-2022 走看看