Struts2 入门学习总结二

本文详细解析了Struts2框架的配置过程,包括6个核心配置文件的作用及加载顺序,深入介绍了struts.xml中常配置的属性。同时,文章探讨了Action的三种创建方式与三种访问方式,包括全匹配、通配符和动态方法访问的配置实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Struts2的配置文件

Struts2中的6个配置文件:

  1. default.properties
  2. struts-default.xml
  3. struts-plugin.xml
  4. struts.xml
  5. struts.properties
  6. web.xml

配置文件的加载顺序和上图一致。当多个配置文件中,有相同的参数,后加载的值会覆盖先加载的值。

  • default.properties

该配置文件的路径为struts2-core-2.5.17.jar/org/apache/struts2/default.properties

下面是需要我们了解的配置属性

配置应用中使用的编码

和spring框架整合有关

指定文件上传的时候使用的组件

文件上传总大小限制

能进入框架内部的url地址的后缀,多个用逗号分隔

是否允许动态方法调用

是否开启开发者模式(修改配置不需要重启),出现错误的时候输出更多的报错信息。

页面展示的主题

  • struts-default.xml

该配置文件的路径为struts2-core-2.5.17.jar/struts-default.xml

struts.xml中package的extends属性继承的包

Struts2定义的结果类型,默认结果类型为dispatcher

Struts2定义的拦截器

Struts2中定义的拦截器栈

默认拦截器栈在此定义

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>
    <!-- 所有匹配*.action的请求都由struts2处理 -->
    <constant name="struts.action.extension" value="action" />
    <!-- 是否启用开发模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- struts配置文件改动后,是否重新加载 -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 设置浏览器是否缓存静态内容 -->
    <constant name="struts.serve.static.browserCache" value="false" />
    <!-- 请求参数的编码方式 -->
    <constant name="struts.i18n.encoding" value="utf-8" />
    <!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
    <constant name="struts.i18n.reload" value="true" />
    <!-- 文件上传最大值 -->
    <constant name="struts.multipart.maxSize" value="104857600" />
    <!-- 让struts2支持动态方法调用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <!-- Action名称中是否还是用斜线 -->
    <constant name="struts.enable.SlashesInActionNames" value="false" />
    <!-- 允许标签中使用表达式语法 -->
    <constant name="struts.tag.altSyntax" value="true" />
    <!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
    <constant name="struts.dispatcher.parametersWorkaround" value="false" />


     <!-- package提供了将多个Action组织为一个模块的方式
        package的名字必须是唯一的 package可以扩展 当一个package扩展自
        另一个package时该package会在本身配置的基础上加入扩展的package
        的配置 父package必须在子package前配置 
        name:package名称
        extends:继承的父package名称
        abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
        namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action
     -->
    <package name="com.kay.struts2" extends="struts-default" namespace="/test">
        
        <!-- 定义拦截器 
                name:拦截器名称
                class:拦截器类路径
        -->
        <interceptors>
            <interceptor name="timer" class="com.kay.timer"></interceptor>
            <interceptor name="logger" class="com.kay.logger"></interceptor>
            <!-- 定义拦截器栈 -->
            <interceptor-stack name="mystack">
                <interceptor-ref name="timer"></interceptor-ref>
                <interceptor-ref name="logger"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        
        <!-- 定义默认的拦截器 每个Action都会自动引用
         如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
        <default-interceptor-ref name="mystack"></default-interceptor-ref>
        
        
        <!-- 全局results配置 -->
        <global-results>
            <result name="input">/error.jsp</result>
        </global-results>
        
        <!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)
             name:action名称
             class: 对应的类的路径
             method: 调用Action中的方法名
        -->
        <action name="hello" class="com.kay.struts2.Action.LoginAction">
            <!-- 引用拦截器
                name:拦截器名称或拦截器栈名称
             -->
            <interceptor-ref name="timer"></interceptor-ref>
        
            <!-- 节点配置
                name : result名称 和Action中返回的值相同
                type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher
             -->
         <result name="success" type="dispatcher">/talk.jsp</result>
         <!-- 参数设置 
             name:对应Action中的get/set方法 
         -->
         <param name="url">http://www.sina.com</param>
        </action>
    </package>

</struts>

二、Action的三种创建方式

Ⅰ、无侵入式:(实际开发中用的并不多)

public class doAction {
	
	public String sayHello() {
		
		System.out.printf("hello");
		
		return "success";
		
	}
 
}

在struts.xml进行如下配置

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<package name="mypackage1" namespace="/" extends="struts-default">		
		<action name="do" class="com.zsl.web.action.doAction" method="sayHello">	
			<result name="success">/hello.jsp</result>		
		</action>		
	</package>
</struts>  

Ⅱ、实现接口的方式:(实际开发中用的并不多)

public class helloAction implements Action {

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

}

在struts.xml文件中进行如下配置

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<package name="mypackage2" namespace="/" extends="struts-default">		
		<action name="hello" class="com.zsl.web.action.helloAction">	
			<result name="success">/hello.jsp</result>		
		</action>		
	</package>
</struts>  

动作方法名为excute可以不用写method属性

Ⅲ、继承ActionSupport的方式(默认动作类为ActionSupport,实际开发中主要使用这种方式)

public class hiAction extends ActionSupport {

}

ActionSupport已经实现了excute方法

在struts.xml中需要做如下配置

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<package name="mypackage3" namespace="/" extends="struts-default">		
		<action name="hi" class="com.zsl.web.action.hiAction">	
			<result name="success">/hello.jsp</result>		
		</action>		
	</package>
</struts>  

三、Action的三种访问方式

  • 全匹配配置访问

   userAction代码如下

public class userAction extends ActionSupport {
	
	public String addUser() {
		System.out.println("add");
		return SUCCESS;
	}

	public String deleteUser() {
		System.out.println("delete");
		return SUCCESS;
	}
	
	public String updateUser() {
		System.out.println("update");
		return SUCCESS;
	}
	
	public String findUser() {
		System.out.println("find");
		return SUCCESS;
	}

}

   index.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>
<!-- 全匹配配置访问 -->
<a href="${pageContext.request.contextPath}/addUser">addUser</a>
<br>
<a href="${pageContext.request.contextPath}/deleteUser">deleteUser</a>
<br>
<a href="${pageContext.request.contextPath}/updateUser">updateUser</a>
<br>
<a href="${pageContext.request.contextPath}/findUser">findUser</a>
</body>
</html>

 struts.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<!-- 全匹配配置访问 -->
	<package name="mypackage" namespace="/" extends="struts-default">		
		<action name="addUser" class="com.zsl.web.action.userAction" method="addUser">	
			<result name="success">/hello.jsp</result>		
		</action>
		<action name="deleteUser" class="com.zsl.web.action.userAction" method="deleteUser">	
			<result name="success">/hello.jsp</result>		
		</action>
		<action name="updateUser" class="com.zsl.web.action.userAction" method="updateUser">	
			<result name="success">/hello.jsp</result>		
		</action>
		<action name="findUser" class="com.zsl.web.action.userAction" method="findUser">	
			<result name="success">/hello.jsp</result>		
		</action>		
	</package>
</struts>  
  • 使用通配符访问

   userAction代码如下

public class userAction extends ActionSupport {
	
	public String addUser() {
		System.out.println("add");
		return SUCCESS;
	}

	public String deleteUser() {
		System.out.println("delete");
		return SUCCESS;
	}
	
	public String updateUser() {
		System.out.println("update");
		return SUCCESS;
	}
	
	public String findUser() {
		System.out.println("find");
		return SUCCESS;
	}

}
  • 通配符的基本用法

index.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>
<!-- 通配符配置访问 -->
<a href="${pageContext.request.contextPath}/addUser">addUser</a>
<br>
<a href="${pageContext.request.contextPath}/deleteUser">deleteUser</a>
<br>
<a href="${pageContext.request.contextPath}/updateUser">updateUser</a>
<br>
<a href="${pageContext.request.contextPath}/findUser">findUser</a>
</body>
</html>

 struts.xml文件配置如下

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<!-- 通配符配置访问 -->
	<package name="mypackage" extends="struts-default">		
		<action name="*" class="com.zsl.web.action.userAction" method="{1}">			
			<result name="success">/hello.jsp</result>		
			<allowed-methods>addUser,deleteUser,updateUser,findUser</allowed-methods> 
		</action>	
	</package>
</struts>  

 如果你是用的是Struts2.5以上的版本,那么你需要增加allowed-methods标签,将动作方法写入标签内,否则会出现404错误。

  • 通配符的高级用法

如果我们在项目中如果遇到多个Action的CRUD操作的时候 可以使用以下方式:

index.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>
<!-- 通配符配置访问 -->
<a href="${pageContext.request.contextPath}/add_User">addUser</a>
<br>
<a href="${pageContext.request.contextPath}/delete_User">deleteUser</a>
<br>
<a href="${pageContext.request.contextPath}/update_User">updateUser</a>
<br>
<a href="${pageContext.request.contextPath}/find_User">findUser</a>
</body>
</html>

  struts.xml文件配置如下

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<!-- 通配符配置访问 -->
	<package name="mypackage" extends="struts-default">		
		<action name="*—*" class="com.zsl.web.action.{1}Action" method="{1}{2}">			
			<result name="success">/hello.jsp</result>		
			<allowed-methods>addUser,deleteUser,updateUser,findUser</allowed-methods> 
		</action>	
	</package>
</struts>  
  • 动态方法访问

开启动态方法访问需要在Struts.xml文件中增加一句如下代码来开启动态方法调用

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

index.jsp页面代码如下

​
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<!-- 动态方法访问 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<package name="mypackage" extends="struts-default">		
		<action name="user" class="com.zsl.web.action.userAction">			
			<result name="success">/hello.jsp</result>	
			<allowed-methods>addUser,deleteUser,updateUser,findUser</allowed-methods> 	
		</action>	
	</package>
</struts>  

​

struts.xml文件配置如下

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">    
<struts>
	<!-- 动态方法访问 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<package name="mypackage" extends="struts-default">		
		<action name="user" class="com.zsl.web.action.userAction">			
			<result name="success">/hello.jsp</result>	
			<allowed-methods>addUser,deleteUser,updateUser,findUser</allowed-methods> 	
		</action>	
	</package>
</struts>  

同样需要在action标签中加入一个allowed-methods标签,并将动作方法写入标签中。 

以上为Struts2框架的部分学习总结。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值