• Strust2框架笔记01_XML配置_action编写


    1.Struts2概述

    1.1 什么是Struts2

    • Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
    • Struts2是一个基于MVC设计模式的web层框架,Struts2的内核相对于Struts来讲已经发生巨大变化。
    • 常见的web框架
      • Struts2
      • Struts1
      • Webwork
      • SpringMVC

    1.2 Web层框架基于前端控制器模型设计

    • 前端控制器模型

      前端控制器模型

    2. Struts2入门案例

    2.1 Struts2的开发环境

    2.2 解压开发包

    • 解压struts-2.3.24-all

    • apps----------Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以允许。

    • docs ----------Struts2的开发文档和API

    • lib--------------Strtus2框架的开发的jar包

    • src-------------Struts2的源码

    2.3 创建项目,引入jar包

    • 将..struts-2.3.24-allstruts-2.3.24apps下的struts2-blank.war包拷贝到tomcat的webapps目录下,启动tomcat服务器,war包会自动解压成一个工程。
    • 打开解压的该工程找到lib目录下就可以看到建立一个最简单的Struts2工程需要的jar包了。

    相关jar包

    • 将这些jar包拷贝到新建的工程中

    2.4 创建一个JSP页面

    • WebContent/demo1/demo1.jsp

      <%@ page language="java" contentType="text/html; charset=utf-8"
          pageEncoding="utf-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="utf-8">
      <title>Insert title here</title>
      </head>
      <body>
      <h2>Struts2的入门</h2>
      <h3><a href="${pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3>
      </body>
      </html>
      

    2.5 编写Action的类

    package com.itzhouq.struts.demo1;
    /**
     * 	Struts2的入门的Action类
     *
     */
    public class HelloAction {
    	/**
    	 * 	提供一个方法:
    	 * 	*方法签名固定的,公有的,返回值是String类型,方法名为execute,在这个方法中不能传递参数
    	 */
    	
    	public String execute() {
    		System.out.println("HelloAction执行了。。。。");
    		return null;
    	}
    }
    
    

    2.6 对Action进行配置

    • 在src下创建(提供)名称叫做struts.xml的配置文件
    <?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>
    	<!-- Struts2为了管理Action的配置,通过包进行管理 -->
    	<!-- 配置Struts2的包=========== -->
    	<package name="demo1" extends="struts-default" namespace="/">
    		<!-- 配置Action===== -->
    		<action name="hello" class="com.itzhouq.struts.demo1.HelloAction"/>
    	</package>
    
    </struts>
    

    2.7 配置前端控制器(核心过滤器)

    • 在web.xml文件中添加以下内容
    <!-- 配置Struts2的核心控制器 -->
      <filter>
      		<filter-name>struts2</filter-name>
      		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <filter-mapping>
      	<filter-name>struts2</filter-name>
      	<url-pattern>/*</url-pattern>
      </filter-mapping>
    

    2.8 测试

    • 发布项目
    • 访问JSP的文件,在控制台能打印相关信息。

    2.9 改写Action中的方法的返回值

    package com.itzhouq.struts.demo1;
    /**
     * 	Struts2的入门的Action类
     *
     */
    public class HelloAction {
    	/**
    	 * 	提供一个方法:
    	 * 	*方法签名固定的,公有的,返回值是String类型,方法名为execute,在这个方法中不能传递参数
    	 */
    	
    	public String execute() {
    		System.out.println("HelloAction执行了。。。。");
    		return "success";
    	}
    }
    

    2.10 改写struts.xml

    <struts>
    	<!-- Struts2为了管理Action的配置,通过包进行管理 -->
    	<!-- 配置Struts2的包=========== -->
    	<package name="demo1" extends="struts-default" namespace="/">
    		<!-- 配置Action===== -->
    		<action name="hello" class="com.itzhouq.struts.demo1.HelloAction">
    			<!-- 配置页面的跳转 -->
    			<result name="success">/demo1/success.jsp</result>
    		</action>
    	</package>
    
    </struts>
    

    2.11 编写success.jsp

    <body>
    <h1>页面跳转成功!!!</h1>
    </body>
    

    2.12 再次测试

    • 访问项目地址,控制台打印了HelloAction执行了。。。。信息,页面跳转到了success.jsp页面。

    3. Struts2的执行流程

    • 当用户访问到某一个Action的时候,先经过核心过滤器,在核心过滤器中执行一组核心拦截器(这组拦截器实现部分功能),执行目标Action,根据Action的返回值,进行页面跳转。

    Struts2的执行流程

    4. Struts2的常见配置

    4.1 XML的提示问题

    • 断网条件下,xml的提示需要手动配置本地dtd文件
    • 首先复制xml文件中的连接http://struts.apache.org/dtds/struts-2.3.dtd,再进行以下配置

    XML提示配置方式

    4.2 Struts2的配置文件的加载顺序(了解)

    4.2.1 源码:Struts2的配置文件的加载顺序

    配置文件的加载顺序

    • init_DefaultProperties(); ------------------------------------------------------------加载default.properties
    • init_TraditionalXmlConfigurations(); -----加载struts-default.xml、struts-plugin.xml、struts.xml
    • init_LegacyStrutsProperties();------------------------------------------------------加载struts.properties
    • init_CustomConfigurationProviders();-------------------------------------------------加载配置提供类
    • init_FilterInitParameters() ;------------------------------------------加载web.xml中过滤器初始化参数
    • init_AliasStandardObjects() ;----------------------------------------------------------------加载Bean对象

    4.2.2 加载顺序

    • default.properties

    • struts-default.xml

    • struts-plugin.xml

    • struts.xml

    • struts.properties

    • web.xml

      • 前三个是框架提供的配置文件,后三个都可以配置Struts2的常量
      • 注意:后配置的常量的值会覆盖先配置的常量的值。

    4.3 Action的配置

    4.3.1 package相关配置

    • package标签称为包,这个包与Java中的包的概念不一致。这个包为了更好管理action的配置。

    • package标签的属性

      • name:包的名称,只有在一个项目中不重名即可。

      • extends:继承哪个包,通常值为struts-default。

      • namespace:名称空间,与<action>标签中的name属性共同决定访问路径。

        • 名称空间有三种写法:

          1. 带名称的名称空间:namespace=”/aaa”

          2. 跟名称空间:namespance=”/”

          3. 默认名称空间:namespace=””

      • abstract :抽象的,用于其他包的继承.

    4.3.2 action相关配置

    • action标签配置Action类.
    • action标签的属性:
      • name :与namespace共同决定访问路径
      • class :Action类的全路径
      • method :执行Action中的哪个方法的方法名,默认值execute
      • converter :用于设置类型转换器

    4.4 Struts2中常量的配置

    • 在Struts2的框架中,提供了非常多的常量,主要在default.properties中

    • struts.i18n.encoding=UTF-8 ----Struts2中所有的post请求的中文乱码不用处理。

    • struts.action.extension=action,, ----Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。

    • 在Struts2中修改一些常量的值:可以与三个位置

      • struts.xml中进行修改

        <!-- 配置Struts2的常量 -->
        	<constant name="struts.action.extension" value="abc"/>
        
      • struts.properties中进行修改

        struts.action.extension=action
        
      • web.xml中进行修改

        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
            <!-- 修改常量 -->
            <init-param>
                <param-name>struts.action.extension</param-name>
                <param-value>xyz</param-value>
            </init-param>
        </filter>
        
      • 一般在struts.xml中进行修改,如果在三个文件中都修改,则以web.xml中为准。

    4.5 分模块开发的配置

    • include的配置,引入多个struts.xml配置文件

      <include file="com/itzhouq/struts/demo1/struts_demo1/xml"/>
      

    5. Action的访问

    5.1 Action的三种写法

    5.1.1 方式一:Action类是POJO类

    package com.itzhouq.struts.demo2;
    /**
     * 	Action的编写方式:Action类是一个POJO类
     * @author itzhouq
     *
     */
    public class ActionDemo1 {
    	public String execute() {
    		System.out.println("ActionDemo1执行了.......");
    		return null;
    	}
    }
    

    5.1.2 方式二:Actions实现了一个Action的接口

    package com.itzhouq.struts.demo2;
    
    import com.opensymphony.xwork2.Action;
    
    /**
     * 	Action的编写方式二:实现一个Action接口
     * 	* 实现接口的这种方式:提供了五个常量(五个逻辑视图的名称)
     * 		*SUCCESS:成功
     * 		*ERROR:失败
     * 		*LOGIN:登录出错页面跳转
     * 		*INPUT:表单校验的时候出错
     * 		*NONE:不跳转
     * 
     * @author itzhouq
     *
     */
    public class ActionDemo2 implements Action {
    
    	@Override
    	public String execute() throws Exception {
    		System.out.println("ActionDemo2执行了..........");
    		return null;
    	}
    	
    }
    

    5.1.3 方式三:Action类继承ActionSupport类【推荐】

    package com.itzhouq.struts.demo2;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * 	Action的编写方式三:Action类继承ActionSupport类
     * 	***推荐使用继承ActionSupport的方式:
     * 		***ActionSupport提供了数据校验、国际化等一系列操作的方法。
     * @author itzhouq
     *
     */
    public class ActionDemo3 extends ActionSupport {
    	@Override
    	public String execute() throws Exception {
    		System.out.println("ActionDemo3执行了............");
    		return NONE;
    	}
    
    }
    

    三种写法在配置文件的配置信息:

    <package name="demo2" extends="struts-default" namespace="/">
    <!-- 配置Action===== -->
    <action name="ActionDemo1" class="com.itzhouq.struts.demo2.ActionDemo1"></action>
    <action name="ActionDemo2" class="com.itzhouq.struts.demo2.ActionDemo2"></action>
    <action name="ActionDemo3" class="com.itzhouq.struts.demo2.ActionDemo3"></action>
    </package>
    

    5.2 Action的访问

    5.2.1 通过method设置

    首先写一个JSP页面../WebContent/demo3/demo3.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>Action的访问</h1>
    <h3>通过method方式</h3>
    <a href="${ pageContext.request.contextPath }/userFind.action">查询用户</a>
    <a href="${pageContext.request.contextPath }/userDelete.action">删除用户</a>
    <a href="${pageContext.request.contextPath }/userUpdate.action">修改用户</a>
    <a href="${pageContext.request.contextPath }/userSave.action">保存用户</a>
    </body>
    </html>
    

    编写Action类com.itzhouq.struts.demo3.UserAction

    package com.itzhouq.struts.demo3;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * 	Action的访问方式:通过method方式
     * @author itzhouq
     *
     */
    public class UserAction extends ActionSupport {
    	public String find() {
    		System.out.println("查询用户.......");
    		return NONE;
    	}
    	public String delete() {
    		System.out.println("删除用户.......");
    		return NONE;
    	}
    	public String update() {
    		System.out.println("更新用户.......");
    		return NONE;
    	}
    	public String save() {
    		System.out.println("保存用户.......");
    		return NONE;
    	}
    }
    

    在和Action同一个包写编写配置问价com/itzhouq/struts/demo3/struts_demo3.xml

    <?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>
    <!-- Struts2为了管理Action的配置,通过包进行管理 -->
    <!-- 配置Struts2的包=========== -->
    <package name="demo3" extends="struts-default" namespace="/">
    <!-- 配置Action===== -->
    <action name="userFind" class="com.itzhouq.struts.demo3.UserAction" method="find"></action>
    <action name="userDelete" class="com.itzhouq.struts.demo3.UserAction" method="delete"></action>
    <action name="userUpdate" class="com.itzhouq.struts.demo3.UserAction" method="update"></action>
    <action name="userSave" class="com.itzhouq.struts.demo3.UserAction" method="save"></action>
    </package>
    </struts>
    

    在主配置文件中引入struts_demo3.xml

    <include file="com/itzhouq/struts/demo3/struts_demo3.xml"/>
    

    5.2.2 通过通配符的方式【掌握】

    编写Action类ProductAction

    package com.itzhouq.struts.demo3;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class ProductAction extends ActionSupport {
    	public String find() {
    		System.out.println("查找商品....");
    		return NONE;
    	}
    	public String update() {
    		System.out.println("更新商品....");
    		return NONE;
    	}
    	public String delete() {
    		System.out.println("删除商品....");
    		return NONE;
    	}
    	public String save() {
    		System.out.println("保存商品....");
    		return NONE;
    	}
    }
    

    在../struts_demo3.xml配置文件中添加

    <!-- 通配符的方式 -->
    <action name="product_*" class="com.itzhouq.struts.demo3.ProductAction" method="{1}"></action>
    

    通配符的配置

    通配符的配置

    5.2.3 动态方法访问

    • 开启动态方法访问,在struts_demo3.xml配置文件中添加

      <!-- 开启动态方法访问 -->
      <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
      
    • 动态方法访问的配置

      <!-- 动态方法访问的方式 -->
      <action name="customer" class="com.itzhouq.struts.demo3.CustomerAction"></action>
      
    • 编写访问路径jsp文件

      <h3>通过动态方法访问的方式</h3>
      <a href="${ pageContext.request.contextPath }/customer!find.action">查询用户</a>
      <a href="${ pageContext.request.contextPath }/customer!update.action">查询用户</a>
      <a href="${ pageContext.request.contextPath }/customer!delete.action">查询用户</a>
      <a href="${ pageContext.request.contextPath }/customer!save.action">查询用户</a>
      
  • 相关阅读:
    使用SignTool对软件安装包进行数字签名(二)--进行数字签名
    使用SignTool对软件安装包进行数字签名(一)--制作证书
    三角形相关算法--求解三角形顶点坐标
    子网掩码与子网个数、主机地址个数的关系
    pgsql中的lateral使用小结
    Git中rebase失败了如何进行恢复
    灰度发布
    go 中的WaitGroup
    pgsql中json格式数组查询结果变成了字符串
    Go中的unsafe
  • 原文地址:https://www.cnblogs.com/itzhouq/p/Struts2.html
Copyright © 2020-2023  润新知