Skip to content

Latest commit

 

History

History
209 lines (162 loc) · 7.36 KB

Route_Struts2.md

File metadata and controls

209 lines (162 loc) · 7.36 KB

Struts2常见的配置文件包括:struts.xml、struts-config.xml、struts.properties等。Struts2首先要在web.xml中进行配置。

web.xml

<filter>
	<filter-name>struts2</filter-name>
	<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
	</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<url-pattern> 还有一种常见的写法如下。

<url-pattern>.action</url-pattern>

当值为/*时,所有的路由都由Struts2进行解析,此时路由扩展名默认为.action。当值为.action时,只解析特定.action后缀的路由。

需要注意,Struts2扩展名默认为.action,Struts1扩展名默认为.do

<filter-class>

另外,如果是Struts版本<2.1.3<filter-class>标签的值如下。2.1.3之后的版本值是StrutsPrepareAndExecuteFilter

<filter-class>
	org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>

init-param属性

如果filter标签添加了如下的init-param属性,那么扩展名为.json。和在properties文件中添加配置信息struts.action.extension=json效果一样。

<filter>
    <filter-name>struts2</filter-name>
    <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class>
    <init-param>
        <param-name>struts.action.extension</param-name>
        <param-value>json</param-value>
    </init-param>
</filter>

struts.xml

struts.xml用于开发配置,可用于覆盖默认配置default.propertiesstruts.xml包含action、result、interceptor、constant、package、global-results等配置。大概的配置文件形式如下

<struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">
      <action name="hello" class="xx.HelloWorldAction" method="execute">
            <result name="success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

constant

常量配置定义了很多全局的配置,例如文件上传的大小限制、编码方式等。如下几个配置和路由相关。配置扩展名为action。用Convention插件,指定了只在类路径下查找结尾为Action的类。这样就无需在配置文件中配置每个Action

<struts>
  <!--启用Struts2的动态方法调用功能,访问方式为action!method。允许在Actin中直接调用方法而不需要在struts.xml中配置-->
  <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
  <!--指定使用 Spring 框架作为对象工厂。集成Struts2和Spring-->
  <constant name="struts.objectFactory" value="spring" />
  <!--请求Action的url后缀为.action-->
  <constant name="struts.action.extension" value="action, do"/>
	<!--Action的类名以Action为后缀-->
	<constant name="struts.convention.action.suffix" value="Action" />
	<!--Action中没有@Action注解也创建映射-->
	<constant name="struts.convention.action.mapAllMatches" value="true" />
  <!--配置查找Action类的包定位器,只在名为action的包及其子包中查找Action类-->
	<constant name="struts.convention.package.locators" value="action" />
</struts>

package

package标签声明了不同的包,将组件进行模块化。示例如下。只有name属性是必须的,作为package的唯一标识。extends代表继承某个package的所有配置。struts最基础的package是extends="struts-default"namespace是Actions的唯一命名空间,也是该模块的根路由

<package name="login-package" extends="itc-default" namespace="/">
  <action name="login_*" class="loginAction" method="{1}">
    <result name="input">/pages/login/login.jsp</result>
  </action>
</package>

PS:有的namespace的值可能为/a,那么该package下的所有路由前缀都要加上/a

可以看到上述packge继承自itc-defaultitc-default内容如下,作为基础包定义了全局的拦截器、异常跳转等内容。

<package name="itc-default" extends="struts-default">
		<interceptors>
			<interceptor-stack name="myStack">
				<!--必须配置默认拦截器否则action表单中的参数将为null-->
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
			<interceptor name="interceptor" class="com.dahua.dssc.common.aop.Interceptor" />
		</interceptors>
		<!--定义全局异常跳转(PS:global-results必须在global-exception-mappings之前定义)-->
		<global-results>
			<result name="403Error">/common/403.jsp</result>
			<result name="500Error">/common/500.jsp</result>
			<result name="exception">/common/exception.jsp</result>
			<result name="timeout">/common/timeout.jsp</result>
		</global-results>
		<!--指定全局异常-->
		<global-exception-mappings>
			<exception-mapping result="exception" exception="java.lang.Exception" />
		</global-exception-mappings>
	</package>

另外,如果模块过多,Struts2配置时一般将配置文件拆分成多个xml文件,将struts.xml作为所有xml文件的入口,如下。具体的上述配置就要在struts.xml中的引入的某个xml中查看。

<struts>
	<include file="struts/struts-base.xml" />
	<include file="struts/struts-core.xml" />
	...
</struts>

action

每个url对应了一个特定的Action。Action有三种实现方式

public class TestAction{
	public String login() throws Exception { // 包含一个无参数方法返回String或Result对象
      return "success";
   }
}

public class TestAction implements Action{
  @Override
  public String execute() throws Exception {...} // 实现Action接口重写execute方法
}

public class TestAction extends ActionSupport{ 
  public String list() { // 实现ActionSupport接口,不用重写execute方法
    return "list";
  }
}

这些定义的Action配置在struts.xml中也有三种形式

1是将要调用的Action和方法都配置。2是用通配符*替换Action的名字或方法名。3是动态调用,只需要在struts.xml中配置DynamicMethodInvocation为true。就可以通过action!method的形式来调用

# 1
<action name="list" class="com.action.TestAction" method="list" />
  
# 2
<action name="login_*" class="loginAction" method="{1}">
  <result name="input">/pages/login/login.jsp</result>
</action>

<action name="*_*" class="{1}Action" method="{2}">
	<result name="j_{1}_{2}" type="json">
		<param name="root">returnMessage</param>
	</result>
</action>

<action name="/edit*" class="org.apache.struts.webapp.example.Edit{1}Action">
    <result name="failure">/mainMenu.jsp</result>
    <result>{1}.jsp</result>
</action>

<package name="default" namespace="/" extends="struts-default">
  <global-allowed-methods>login,register</global-allowed-methods>
  <action name="user_*" class="action.TestAction" method="{1}">
    <result name="login">/success.jsp</result>
  </action>
</package>

# 3
<action name="ccsAction!*" class="ccsShareAction" method="{1}"></action>

另外,还有个需要注意的地方。class的值可以省略的,如果省略了默认为com.opensymphony.xwork2.ActionSupport类。以如下的案例为例,实际访问的就是result标签中的jsp文件。

<action name="dishConfig">
	<result>/modules/ccs/dishConfig.jsp</result>
</action>

关于正则通配符的用法可以参考官网:https://struts.apache.org/core-developers/wildcard-mappings.html