Struts2框架之快速入门

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应用框架,它的前身是WebWork框架,与Struts1区别就是技术上没有关系。相比Struts1来说,struts2具有更加先进的架构以及思想。

Struts2使用优势:自动封装参数、参数校验、结果的处理(转发|重定向)、国际化、显示等待页面、表单的防止重复提交。

WebWork介绍

WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。WebWork目前最新版本是2.2.2,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。实现Interceptor接口的拦截器,代码部分在intercept方法中实现。在intercept方法中,可以直接返回一个Result字符串,这样整个执行直接“短路”,这时Action的execute方法也不会执行(一般很少会这么用)。所以,一般都会在这个方法里调用参数对象invocation的invoke方法,并返回这个方法执行的结果。这样会持续执行后面的拦截器方法以及Action的execute方法等。

结论:WebWork基于Xwork

Struts2快速入门

导入jar包

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--Struts2的核心filter-->
    <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>
</web-app>

编写Action类

public class HelloAction {
    public String helloAction(){
        System.out.println("测试Action");
        return "success";
    }
}

配置struts.xml(src根目录下)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <!-- package:将Action配置封装.就是可以在Package中配置很多action.
			name属性: 给包起个名字,起到标识作用.随便起.不能其他包名重复.
			namespace属性:给action的访问路径中定义一个命名空间
			extends属性: 继承一个 指定包
			abstract属性:包是否为抽象的; 标识性属性.标识该包不能独立运行.专门被继承
	  -->
    <package name="hello" namespace="/" extends="struts-default">
        <!-- action元素:配置action类
				name属性: 决定了Action访问资源名.
				class属性: action的完整类名
				method属性: 指定调用Action中的哪个方法来处理请求
		 -->
        <action name="helloAtion" class="com.itheima.action.HelloAction" method="helloAction">
            <!-- result元素:结果配置
					name属性: 标识结果处理的名称.与action方法的返回值对应.
					type属性: 指定调用哪一个result类来处理结果,默认使用转发.
					标签体:填写页面的相对路径
			-->
            <result name="success">/hello.jsp</result>
        </action>
    </package>
</struts>

测试

Struts2访问流程

Struts2配置详解

1、Filter(入口 ---StrutsPrepareAndExecuteFilter)

        Prepare:准备  对应init方法
        Execute:执行  对应doFilter
        
        PS:filter与生命周期相关方法:init  destroy  doFilter
        
        准备工作(挖源码):
            --->StrutsPrepareAndExecuteFilter
            --->public void init(FilterConfig filterConfig)
            --->dispatcher = init.initDispatcher(config);
            --->dispatcher.init();
            --->
                init_DefaultProperties(); // [1]                加载org/apache/struts2/default.properties文件
                init_TraditionalXmlConfigurations(); // [2]        加载struts-default.xml,struts-plugin.xml,struts.xml
                init_LegacyStrutsProperties(); // [3]            加载src下的struts.properties文件
                init_FilterInitParameters() ; // [6]            加载Struts2的核心Filter分初始化参数
                
        总结:
            服务器启动--->创建Filter--->初始化方法init执行---->加载一些列的配置文件
            
            default.properties        struts2内置
            struts-default.xml        struts2内置
            struts-plugin.xml        struts2内置
            struts.xml                自定义(重点)
            struts.properties        自定义
            Filter的init            自定义
            
            注意:如果加载的内容有冲突的话,后加载的内容可以覆盖先加载的内容

2、default.properties(配置struts2默认常量)

            struts.i18n.encoding=UTF-8:设置struts2的编码是UTF-8  post不用解决乱码
            struts.multipart.maxSize=2097152:限制上传文件大小  2M 
            struts.action.extension=action,,:访问Action时的扩展名
            struts.devMode = false: 设置开发模式  默认不开启开发模式  设置为true  修改struts2的内容后不需要重启服务器

3、struts-default.xml(常量)

            struts-default包
                  结果跳转类型
                  interceptors拦截器

4、struts-plugin.xml

5、struts.xml(重点)------位置:类加载路径(src)下

<?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>
	
	<!-- 1、常量配置  覆盖default.properties内容-->
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.action.extension" value="action,abc,,"></constant>
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

	<!-- 2、包的配置 
			name: 包的名称
			namespace:命名空间  与Action的name一起组成虚拟访问路径
				namespace="/" 	<action name="quick">
					http://localhost:8080/Struts2Day01/quick
				namespace="/abc" 	<action name="quick">
					http://localhost:8080/Struts2Day01/abc/quick
			extends:该包继承哪一个包
			abstract: 定义该包是一个抽象包   被别的包继承的 (了解)  默认false
			作用:方便管理Action
	-->
	<package name="test" namespace="/" extends="struts-default">
		<!-- 2.1 action的配置
				 name: action的虚拟名称,与namespace一起组成虚拟访问路径
				 class: Action全限定名
				 method: 指定访问该Action中的哪个方法  默认execute方法
			 2.2 结果视图配置result
				 name: 逻辑视图名  与Action的方法的返回值匹配  
		 -->
		<!-- <action name="quick_save" class="com.itheima.action.QuickAction" method="save">
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
		</action>
		<action name="quick_update" class="com.itheima.action.QuickAction" method="update">
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
		</action> -->
		
		<!-- 2.3 action配置优化  (通配符方式) (重点)
				访问虚拟名称中可以使用*代表任意字符串
				method可以使用{n}代表第n个通配符*
				例如:
					name="quick_*"   method="{1}"     
					访问quick_save	 去访问save方法
					
					name="quick_*_*	 method="{1}{2}"
					访问quick_save_User	访问saveUser方法
					
					name="quick_*_*	 method="{1}-{2}"
					访问quick_save_User	访问save-User方法
					
					name="quick_*_*	 method="{1}_{2}"
					访问quick_save_User	访问save_User方法
		-->
		<!-- <action name="quick_*" class="com.itheima.action.QuickAction" method="{1}">
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
		</action> -->
		
		<!-- 2.3 action配置优化  (动态方法调用) (了解)
			action在配置时 不需要指定方法是谁method
			但是需要对访问的 路径进行特殊的规定

			http://localhost:8080/Struts2Day01/虚拟资源名称!方法名称.action
			http://localhost:8080/Struts2Day01/quick!save.action
			
			使用动态方法调用,必须通过配置开启动态方法调用
			<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
		-->
		<!-- <action name="quick" class="com.itheima.action.QuickAction">
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
		</action> -->
		
		<action name="quick_*" class="com.itheima.action.QuickAction" method="{1}">
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
		</action>
	</package>
	
	<!-- 3、包含:该文件包含其他struts的xml文件(分模块开发) -->
	<!-- <include file="struts-customer.xml"></include>
	<include file="struts-linkman.xml"></include> -->
</struts>

6、struts.properties

            src自定义properties文件  该文件作用配置常量(等同于struts.xml中的constant)

7、Filter的init(只能配置常量)

<filter>
	<filter-name>Struts</filter-name>
	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	<init-param>
		<param-name>struts.action.extension</param-name>
		<param-value>action,,</param-value>
	</init-param>
</filter>

struts2的常用API

Action定义的三种方式:
    1、POJO充当Action    (了解)
    2、Action类实现Action接口    (了解)
        Action接口提供5个常量
            SUCCESS:成功
            ERROR:报错
            NONE:不进行视图跳转  相当于null
            INPUT:跳转到输入视图
            LOGIN:跳转登录视图
    3、Action类继承ActionSupport类(重点)
        ActionSupport功能强大

猜你喜欢

转载自blog.csdn.net/aiyowei1106/article/details/81298608
今日推荐