主要涉及3个配置文件:web.xml、struts.xml、struts.properties

1. web.xml

任何参与了web应用程序的请求与响应动作,都必须借助web.xml文件来安装这个框架。

struts2的web.xml配置可以参考 官方文档.

首先需要配置过滤器:

<filter>
<filter-name>struts2</filter-name>
<!-- struts 2.5及以上版本 -->
<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>

如果

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

则只处理以.do.action结尾的请求

通过以上配置就可以使用struts2了。但除此之外,还可以在filter之中配置如下内容:

<init-param>
<!-- 自动加载的系列配置文件 -->
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,/WEB-INF/struts.xml </param-value>
</init-param>
<init-param>
<!-- 配置Struts2框架要扫描的包,多个包用逗号分开。 -->
<param-name>actionPackages</param-name>
<param-value>org.apache.struts2.showcase.person</param-value> </init-param>
<!-- 配置Struts2框架的配置提供者类,多个类用逗号分开 -->
<init-param>
<param-name>configProviders</param-name>
<param-value>com.MyConfigurationProvider</param-value>
</init-param>

或者设置某些属性:

<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>

2. struts.xml

Struts2框架的核心配置文件,主要负责管理struts2框架中的action映射和result以及常量属性(或由struts.properties配置)。参考:

官方 Configuration Elements

Struts2 配置文件struts.xml和web.xml详解

默认情况下,Struts2的配置文件名称为struts.xml,且该文件放在src根目录下(即/WEB-INF/classes目录下、src/main/resources)。如果修改了名称或位置,则需要清晰的进行配置,方法即是上文中的filter中的config配置:

<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,struts/struts.xml</param-value>
</init-param>

struts-default.xml,struts-plugin.xml也必须加上,或者在struts.xml文件中添加include标签将两个文件包括进去。

或者采用下述配置(?)

<init-param>
<param-name>filterConfig</param-name>
<param-value>classpath:struts2/struts.xml</param-value>
</init-param>

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="false" />
<!-- 开发模式,在web服务器出错时会尽量打印出来 -->
<constant name="struts.devMode" value="true" />
<!-- 配置文件修改后是否自动重新部署到服务器,开发阶段可设置为true,否则需要不时重启服务器。-->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- struts2是处理以.do和.action为后缀的请求url的(默认是.action)-->
<constant name="struts.action.extension" value="do,action"/>
<!-- 包含其他的struts2配置,file属性是相对/WEB-INF/classes的路径 -->
<include file="Home.xml"/>
<!-- 全局异常配置 -->
<package name="main" namespace="/" extends="struts-default">
<!--指定一个默认的Action,如果系统没有找到指定的Action,就会指定来调用这个默认的Action -->
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
</package> <package name="employee" extends="struts-default" namespace="/employee">
<!-- 设置整个包范围内所有Action所要应用的默认拦截器信息。一般不用设置而使用框架默认的即可 -->
<default-interceptor-ref name="crudStack"/>
<action name="delete" method="delete"
class="org.apache.struts2.showcase.action.EmployeeAction" >
<result name="error">/empmanager/editEmployee.jsp</result>
<result type="redirect">edit-${currentEmployee.empId}.action</result>
<!-- 拦截器信息,一般也不设置 -->
<interceptor-ref name="basicStack"/>
</action>
</package>
<!-- 多继承,json配置 -->
<package name="employee" extends="struts-default, json-default" namespace="/employee">
<action name="list" method="list" class="org.apache.struts2.showcase.action.EmployeeAction" >
<result>/empmanager/listEmployees.jsp</result>
<result type="json">
<param name="root">employees</param>
</result>
</action>
</package>
</struts>

特别地,对于返回json的配置(基于 struts2-json-plugin)(参考: stackoverflow例子json-pluginStruts2返回JSON对象的方法总结 ):

public class Struts2Action extends ActionSupport {
private String jsonString;
public String execute() {
Gson gson = new Gson();
jsonString = gson.toJson(audioTaggingService.findTagsByName(q));
return "success";
}
//没有getter的属性将不会出现在json中
public String getJsonString() {
return jsonString;
}
public void setJsonString(String jsonString) {
this.jsonString = jsonString;
}
}

配置xml。注意extends中必须出现json-default,可以没有struts-default(因为json-default继承自它)。

root指明了要序列化为json的对象。如果action类中只有一个属性,可以不设置root。

<package name="json" extends="struts-default,json-default" >
<action name="someJsonAction" class="com.something.Struts2Action">
<result type="json">
<param name="noCache">true</param>
<param name="excludeNullProperties">true</param>
<param name="root">jsonString</param>
</result>
</action>
</package>

附:返回json还有一种简便的方法,即将生成好的json字符串写入到response中去,返回给前端使用。对实体对象转JSON有许多组件可用,如FastJSON,GSON等。

public static void writeJson(String json)
{
//每次调用都进行初始化
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("application/json;charset=utf-8");
try
{
response.getWriter().write(json);
response.getWriter().flush();
response.getWriter().close();
}
catch (IOException e)
{ e.printStackTrace(); }
}

3. struts.properties文件

本文件主要负责配置struts2中大量的属性(struts.xml中的<constant name="" value="">)。

部分属性:

struts.locale:默认 en_US,指定 locate 和 encoding schema

struts.il8n.encoding:设置默认编码集,默认值为 utf-8

struts.objectFactory:默认值 spring

struts.objectFactory.spring.autoWire:指定spring框架的自动装配模式,默认值 name(默认根据name属性装配)。可选值为:name/ type/auto/construtor

struts.multipart.parser 处理multipart/form-data的MIME类型请求框架,默认 jakarta,即 common-fileupload

struts.multipart.saveDir 保存上传文件的临时路径

struts.multipart.maxSize允许上传的最大字节数

struts.action.extension默认为 action,为了支持.do,可设置为 "do,action"

4.注解式开发

依赖struts2-convention-plugin。注解与基于xml配置基本是一致的。

基本无需进行配置,或者只需要极其少量的配置(针对struts.xml)。

进行全局配置:配置一个名为base,继承自json-default的package,便于后续使用。

<package name="base" extends="json-default,struts-default">
<!-- 这里可以设置一些全局的返回值映射关系等 -->
</package>

然后,在Action类代码中使用注解:

//若struts.xml中没有配置名为 base 的包,则 “base” 需要写成 "json-default"。如果不是json,则为"struts-default"
@ParentPackage("base")
@Namespace("/watson") //命名空间
@Results({
@Result(name = "json",type="json", params={"root","msg"})
}) //reuslt配置
public class JsonAction {
private Map<String, Object> msg;
//msg必须有getter方法才能出现在JSON中
public Map<String, Object> getMsg() {
return msg;
}
@Action(value="json")
public String json() {
msg = new HashMap<String, Object>();
msg.put("user", user);
return "json";
}

基于方法的@Result注解

@Action(    value="login",  //表示action的请求名称
results={ //表示结果跳转
@Result(name="success",location="/success.jsp",type="redirect"),
@Result(name="login",location="/login.jsp",type="redirect"),
@Result(name="error",location="/error.jsp",type="redirect")
},
//表示拦截器引用
interceptorRefs={@InterceptorRef("defaultStack"), @InterceptorRef("timer")},
//异常映射声明
exceptionMappings={@ExceptionMapping(exception="java.lang.Exception",result="error")}
)
public String login() throws Exception {
int i = 1/0 ;
if ("admin".equals(user.getUsercode()) && "admin".equals(user.getUserpswd())) {
Map session = ActionContext.getContext().getSession();
session.put("session_user", user);
return "success";
} else {
return "login";
}
}

5.与Spring框架集成的配置

需要struts2-spring-plugin,参考: Struts2+Spring集成合并

<constant name="struts.objectFactory" value="spring" />

  1. 方案一,Struts2负责流程,Spring负责对象的创建;Action由Struts2框架负责创建;Service由Spring框架负责创建

    这种情况下,只需要按要求分别配置好Struts2和Spring即可。或者根据需要修改struts.objectFactory.spring.autoWire等配置。

    这个时候使用注解开发,Action类无需使用Spring的@Controller注解,但需加上@Scope("prototype")设为多例
  2. 方案二,Struts2负责流程,Spring负责对象的创建,Action和Service都由Spring框架负责创建。这是常用的集成合并方案

    主要看一下两个框架核心配置文件的和第一种方案的写法区别:
  • struts2.xml的写法:
<struts>
<!-- 注意class的值,这里是Spring中bean的id,是为了在Spring中根据此值进行查找 -->
<!-- 写完整包名代表Action还是由Struts管理,action都是多例! -->
<package name="example" namespace="/user" extends="struts-default">
<action name="login" class="loginAction" method="login">
<result name="success" type="redirect">/success.jsp</result>
<result name="login" type="redirect">/login.jsp</result>
</action>
</package>
</struts>
</span>
  • spring配置文件 applicatinContext.xml的写法:
<!--这里的id对应上边的class,这里的class才是真正的路径,采用了Spring的根据name自动装配的功能,当然也可以我们手动指定,
这里需要注意的是,action需要多例创建,而Spring默认为单例创建的,所以需要指定scope="prototype"-->
<bean id="loginAction" class="com.ljh.action.LoginAction" autowire="byName" scope="prototype"></bean>
<bean id="userService" class="com.ljh.service.UserService" ></bean>
</span>

如果都采用注解的方式,Action使用 @Controller注解

注:

struts2的单例多例问题

  1. Struts2会对每一个请求,产生一个Action的实例来处理. ---多例
  2. Spring的Ioc容器管理的bean默认是单实例的. ---单例

Struts2 学习记录-1--Struts2中的配置文件的更多相关文章

  1. Struts2学习记录-Value Stack(值栈)和OGNL表达式

    仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...

  2. struts2学习笔记之八:Action中方法的动态调用

    方法一:action名称+!+方法名称+后缀 Action类中增加addUser()和delUser()方法, package com.djoker.struts2; import org.apach ...

  3. 【JavaEE企业应用实战学习记录】struts2登录

    <%-- login.jsp Created by IntelliJ IDEA. User: Administrator Date: 2016/10/6 Time: 16:26 To chang ...

  4. 【Struts2学习笔记-4】包含其他配置文件

    包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...

  5. Struts2学习第一天——struts2基本流程与配置

    struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实 ...

  6. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Struts2学习第一天--Struts2的概述、Struts2的入门、Struts2常见的配置、Struts2的Action的编写

    action的name要与访问路径对应.hello.action. 加到tomcat启动 访问:http://localhost:8080/struts2-1/demo1/demo1.jsp 改为su ...

  8. struts2 学习记录 过滤器 国际化

    struts2接触不是一天两天了,但是一直没有用它做什么项目,但老师确一直说它有很大的学习价值,所以还是把我学习到的东西给记录一下,记录的东西没有规律,只是给自己留个备份, struts2中最关键的是 ...

  9. [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. call()与apply()用法

    call()和apply()的作用都是一样的——通过改变函数体内部 this 的指向,借用对象的方法的目的 还是举个栗子吧: function Cat(){ this.food = 'fish'; t ...

  2. c++ o2 优化

    有时候,写代码的时候要卡常 这时候就要用到o2优化 #pragma GCC optimize(2) 只要把这句话加在程序开头,就可以手动开o2优化了

  3. 在jenkins和sonar中集成jacoco(二)--在jenkins中生成jacoco覆盖率报告

    先要在jenkins上安装jacoco的插件,安装完成之后在job的配置项中可以增加这个选项: 第一个录入框是你的覆盖率文件(exec),第二个是class文件目录,第三个是源代码文件目录. 配置好了 ...

  4. Alpha发布

    作业链接[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2283] 视频展示 链接[https://v.youku.com/v_show/ ...

  5. 在mysql中,如何改变列声明.

    C 在mysql中,如何改变列声明. 修改表 - 修改列名 使用 CHANGE COLUMN 来修改列的名字,还必须 设置 列的数据类型 mysql> desc test_tab -> / ...

  6. 使用c++实现一个FTP客户端(三)

    接上篇:http://www.cnblogs.com/jzincnblogs/p/5217688.html,这篇主要记录编程过程中需要注意的地方以及遇到的一些问题及解决方法. 一.gethostbyn ...

  7. Hibernate对象的三种状态,瞬时态、持久态、游离态

    1.瞬时态.(new完一个对象,突然断电,内存中没有此对象) hibernate中什么时候的对象为瞬时态呢,当我们new 一个对象时,还没有save时,它就是瞬时态的,当我们delete一个对象时,它 ...

  8. Windows下Java JDK8配置环境变量

    JDK最新版已经出到了jdk8u60,下载安装完成后,还需要配置环境变量,下面小编就给大家分享下jdk 8.0的环境变量配置教程,希望大家喜欢. jdk8.0环境变量配置教程 右键选择 计算机→属性→ ...

  9. 1029:Ignatius and the Princess IV

    题目大意是找出数组中出现次数超过一半的数. 基本思想:每遇到两个不同的数就消掉,设一个计数器就行了.   存出现次数最大的那个数的出现次数. 当下一个数与当前的数不同时,计数器减一,相同,则加一. 实 ...

  10. streamsets excel 数据处理

    streamsets 有一个directory的origin 可以方便的进行文件的处理,支持的格式也比较多,使用简单 pipeline flow 配置 excel 数据copy 因为使用的是容器,会有 ...