Struts2 配置相关问题

CSRF 原理以及 Struts2 令牌校验防御攻略解析 阅读详情

一、 在 web.xml 配置 struts.xml

struts-default.xml,struts-plugin.xml 系统默认必需加上,后面写自己的struts.xml

位置 是从 WEB-INF 的 classes 开始计算


struts.xml 的路径为 WEB-INF/struts-configs/struts.xml (沿用struts1的习惯)

struts-default.xml文件位置 不用动 , 不需要 放在WEB-INF/struts-configs/中


更改web.xml

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,../struts-configs/struts.xml </param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

普通 Struts 2 配置 web.xml

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="GBK"?>
  2. <!-- 配置Web应用配置文件的根元素,并指定配置文件的Schema信息 -->
  3. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  7. <!-- 定义Struts 2的核心控制器:FilterDispatcher -->
  8. <filter>
  9. <!-- 定义核心Filter的名字 -->
  10. <filter-name>struts2</filter-name>
  11. <!-- 定义核心Filter的实现类 -->
  12. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  13. </filter>
  14. <!-- FilterDispatcher用来初始化Struts 2并且处理所有的HTTP请求 -->
  15. <filter-mapping>
  16. <filter-name>struts2</filter-name>
  17. <url-pattern>/*</url-pattern>
  18. </filter-mapping>
  19. </web-app>

2. Struts 2.2.1 配置 web.xml 之类

与 2.1 略有不同

web.xml

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <welcome-file-list>
  7. <welcome-file>index.jsp</welcome-file>
  8. </welcome-file-list>
  9. <filter>
  10. <filter-name>struts2</filter-name>
  11. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>struts2</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17. </web-app>

struts.xml

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
  3. <struts>
  4. <package name="js" extends="struts-default" namespace="/09">
  5. <action name="ifAction" class="js.IfAction">
  6. <result name="success">/09/s-if.jsp</result>
  7. </action>
  8. </package>
  9. </struts>
Html代码 复制代码 收藏代码
  1. <s:a action="09/ifAction">s-if.jsp</s:a>
 <s:a action="09/ifAction">s-if.jsp</s:a>   

二、 struts2.2.1 报错

1. 缺少 javassist-3.7.ga.jar 包

如有以下报错:

Txt代码 复制代码 收藏代码
  1. 2010/12/15 11:25:37 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error
  2. 致命的: Dispatcher initialization failed
  3. java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
  4. at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:295)
  5. at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:431)
  6. at com.opensymphony.xwork2.inject.ContainerBuilder$5.create(ContainerBuilder.java:207)
  7. at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51)

Struts2最新版本2.2.1中所设计的核心库文件,包括以下内容:
struts2-core-2.2.1.jar :Struts2框架的核心类库。
xwork-core-2.2.1.jar :Xwork核心类库,Struts2在其上构建。
ognl-3.0.jar :对象图导航语言(Object Graph Navigation Language),它是一种功能强大的表达式语言(Expression Language,简称为EL),通 过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
freemarker-2.3.16.jar :Struts 2的UI标签的模板使用FreeMarker编写。
commons-fileupload-1.2.1.jar :文件上传组件,2.1.6版本后必须加入此文件。
commons-io-1.3.2.jar :IO输入输出流组件,主要完成文件的读写功能。
javassist-3.7.ga.jar :Javassist是一个开源的分析、编辑和创建Java字节码的类库。
-------------------------------------------------------------------
commons-logging-1.0.4.jar :ASF出品的日志包,Struts2框架使用这个日志包来支持Log4J和JDK 1.4版本之上的日志记录

注意: javassist-3.7.ga.jar struts2源码包里没有,可以去下载。。也可以ognl-3.0.jar 替换成ognl-2.6.11.jar,这 样就不必要加javassist-3.7.ga.jar

●  少了javassist-3.7.ga.jar ,可以在struts2-2.2.1-all.zip 包中找到

  方法: 打开 struts2-2.2.1-all\struts-2.2.1\apps\ 目录下随便一个.war 文件 用解压软件,然后在 WEB-INF/lib 下找到 javassist-3.7.ga.jar

2. 没有使用 spring 去掉一些包

Txt代码 复制代码 收藏代码
  1. 2010/12/15 11:44:13 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error
  2. 致命的: Dispatcher initialization failed
  3. java.lang.NullPointerException
  4. at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(SpringObjectFactory.java:220)
  5. at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyResultType(XmlConfigurationProvider.java:530)
  6. at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addResultTypes(XmlConfigurationProvider.java:501)

原因两个:
1.
lib 中多导入包的大原因:去掉 struts2-spring-plugin-2.1.8 包即可,因为没有用到spring 。
2. 还有的原因是用spring了,却没加监听器,在 web.xml 里面加上

Xml代码 复制代码 收藏代码
  1. <listener>
  2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3. </listener>

3. struts 2.2.1 基本功能使用的包

commons-fileupload-1.2.1.jar

commons-io-1.3.2.jar

freemarker-2.3.16.jar

javassist-3.7.ga.jar

ognl-3.0.jar

struts2-core-2.2.1.jar

xwork-core-2.2.1.jar

三、 struts 2 中 jsp 提交 list ,map 到 Action

详情请看 : Struts 2 的标签库(二) 中的 3.2 iterator 标签

Html代码 复制代码 收藏代码
  1. <s:form action="iteratorAction.action" method="post">
  2. <h3>action の List</h3>
  3. <s:iterator value="list" id="aList" status="st">
  4. index:&nbsp;&nbsp;&nbsp;&nbsp;
  5. <s:property value="#st.index"/>
  6. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  7. value:&nbsp;&nbsp;&nbsp;&nbsp;
  8. <s:property value="aList"/>
  9. <br/>
  10. <!-- 下面是把 list 传回 Action -->
  11. <s:hidden name="list[%{#st.index}]" value="%{list[#st.index]}"></s:hidden>
  12. </s:iterator>
  13. <br/><br/>
  14. <h3>action の Map</h3>
  15. <s:iterator value="map" id="aMap" status="st">
  16. index:&nbsp;&nbsp;&nbsp;&nbsp;
  17. <s:property value="#st.index"/>
  18. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  19. key:&nbsp;&nbsp;&nbsp;&nbsp;
  20. <s:property value="key"/>
  21. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  22. value:&nbsp;&nbsp;&nbsp;&nbsp;
  23. <s:property value="value"/>
  24. <br/>
  25. <!-- 下面是把 map 传回 Action -->
  26. <input type="hidden" name="map['<s:property value="key"/>']" value="<s:property value="value"/>"></input>
  27. </s:iterator>
  28. <br/><br/>
  29. <input type="submit" value="submit"></input>
  30. </s:form>
<s:form action="iteratorAction.action" method="post">

	<h3>action の List</h3>
	<s:iterator value="list" id="aList" status="st">
		index:&nbsp;&nbsp;&nbsp;&nbsp;
		<s:property value="#st.index"/> 
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
		value:&nbsp;&nbsp;&nbsp;&nbsp;
		<s:property value="aList"/>
		<br/>
		
		<!-- 下面是把  list 传回 Action -->
		<s:hidden name="list[%{#st.index}]" value="%{list[#st.index]}"></s:hidden>		
	</s:iterator>
	<br/><br/>	
	<h3>action の Map</h3>
	<s:iterator value="map" id="aMap" status="st">
		index:&nbsp;&nbsp;&nbsp;&nbsp;
		<s:property value="#st.index"/> 
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
		key:&nbsp;&nbsp;&nbsp;&nbsp;
		<s:property value="key"/>
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
		value:&nbsp;&nbsp;&nbsp;&nbsp;
		<s:property value="value"/>
		<br/>
		
		<!-- 下面是把  map 传回 Action -->
		<input type="hidden" name="map['<s:property value="key"/>']" value="<s:property value="value"/>"></input>
		
	</s:iterator>
	<br/><br/>
	<input type="submit" value="submit"></input>
</s:form>

下面这段是关键:

list

1.

<s:iterator value="list" id="aList" status="st">
<!-- 下面是把 list 传回 Action -->
<s:hidden name="list[%{#st.index}]" value="%{list[#st.index]}"></s:hidden>

</s:iterator>
<br/><br/>

2.

<input type="hidden" name="list2[<s:property value="#st.index" />]" value="<s:property value="tl2"/>"></input>

map
<s:iterator value="map" id="aMap" status="st">
<!-- 下面是把 map 传回 Action -->
<input type="hidden" name="map['<s:property value="key"/>']" value="<s:property value="value"/>"></input>
</s:iterator>

Java代码 复制代码 收藏代码
  1. package js;
  2. import java.util.*;
  3. import com.opensymphony.xwork2.ActionSupport;
  4. public class IteratorAction extends ActionSupport {
  5. private List<String> list ;
  6. private Map<String,String> map ;
  7. @Override
  8. public String execute() throws Exception {
  9. if (list == null || list.isEmpty()) {
  10. System.out.println("list is null !");
  11. list = new ArrayList<String>();
  12. list.add("あ");
  13. list.add("い");
  14. list.add("う");
  15. list.add("え");
  16. list.add("お");
  17. } else {
  18. System.out.println("list is not null !");
  19. System.out.println(list.toString());
  20. }
  21. if (map == null || map.isEmpty()) {
  22. System.out.println("map is null !");
  23. map = new HashMap<String, String>();
  24. map.put("a", "か");
  25. map.put("b", "き");
  26. map.put("c", "く");
  27. map.put("d", "け");
  28. map.put("e", "こ");
  29. } else {
  30. System.out.println("map is not null !");
  31. System.out.println(map.toString());
  32. }
  33. return SUCCESS;
  34. }
  35. public List<String> getList() {
  36. return list;
  37. }
  38. public void setList(List<String> list) {
  39. this.list = list;
  40. }
  41. public Map<String, String> getMap() {
  42. return map;
  43. }
  44. public void setMap(Map<String, String> map) {
  45. this.map = map;
  46. }
  47. }
package js;

import java.util.*;

import com.opensymphony.xwork2.ActionSupport;

public class IteratorAction extends ActionSupport {

    private List<String> list ;
    private Map<String,String> map ;
    
    @Override
    public String execute() throws Exception {
        if (list == null || list.isEmpty()) {
            System.out.println("list is null !");
            list = new ArrayList<String>();
            list.add("あ");
            list.add("い");
            list.add("う");
            list.add("え");
            list.add("お");
        } else {            
            System.out.println("list is not null !");
            System.out.println(list.toString());
        }
     
        if (map == null || map.isEmpty()) {
            System.out.println("map is null !");
            map = new HashMap<String, String>();
            map.put("a", "か");
            map.put("b", "き");
            map.put("c", "く");
            map.put("d", "け");
            map.put("e", "こ");
        } else {
            System.out.println("map is not null !");
            System.out.println(map.toString());
        }
        
        return SUCCESS;
    }
    
    
    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }
}
Xml代码 复制代码 收藏代码
  1. <package name="js" extends="struts-default" namespace="/09">
  2. <action name="iteratorAction" class="js.IteratorAction">
  3. <result name="success">/09/s-iterator.jsp</result>
  4. </action>
  5. </package>

四、 ActionContext、ValueStack、Stack Context

看源码你就会发现,ActionContext这个类中有一个变量:
Map context,
实际上调用 ActionContext的put,get 就相当于调用context的相就方法,你在页面上通过获取的就相当于调用 context.get("request"),context.get("attr"),而你通过ac.put("list", List)也只能通过ac.get("list")获得。
而ActionContext.getValueStack()相当于调用context.get(OgnlValueStack.VALUE_STACK)所获取的与通过ActionContext.get("request")获取的是不一样的东西
=======================================================================================

ActionContext
一次Action调用都会创建一个ActionContext
调用:ActionContext context = ActionContext.getContext()

ValueStack
由OGNL框架实现
可以把它简单的看作一个List


Stack Object:放入stack中的对象,一般是action。
Stack Context(map):stack上下文,它包含一些列对象,包括request/session/attr/application map等。
EL:存取对象的任意属性,调用对象的方法,遍历整个对象结构图
=======================================================================================
ActionContext是Action上下文
可以得到request session application
ValueStack是值栈 存放表单中的值
Stack Context 栈上下文 也是用来存值的
=======================================================================================
你可以通过在页面中添加<s:debug/>标签察看ValueStack 和Stack Context中有哪些具体的内容。ValueStack里面的东西先入后出,很多没有id的元素使用完之后就退栈了。
StackContext提供了一些命名对象,这些命名对象与根对象无关,访问这些对象需要使用#前缀指名。比如这里面存在:parameters对象,request对象, session对象,application对象等等。
=======================================================================================
value stack contents ognl 值栈
stack context action上下文

action上下文是一个map对象,通过#key获得对象内容,在#request又可以得到值栈,值栈里存储的是一些action里的变量
于是获得action变量内容有三种方式
1,从值栈中直接获得
<s:property value="type"/>
${type }
2,从action上下文获得值栈的属性
<s:property value="#request['type']"/>或者<s:property value="#request.type"/>
=======================================================================================
1)  ValueStack 可以用 request.getAttribute("struts.valueStack") 取得的一个 com.opensymphony.xwork2.util.OgnlValueStack 实例,它实现为一个栈,有 peek()、pop()、push(obj) 方法。

   2) Stack Context 是在前面的 ValueStack 的上下中的一个 java.util.Stack 实例:
  //stack 为 ValueStack 实例,COMPONENT_STACK="__component_stack"
  // org.apache.struts2.components.Component.getComponentStack() 中的代码
  Stack componentStack = (Stack) stack.getContext().get(COMPONENT_STACK);

五、 struts2 的 ONGL 标签取值


经常搞不清楚 % , # 怎么用。

1. 先解决最基础的温饱问题:如何把 action 中的值带到页面展示出来

(先定义一个action ,有个username 字段,假设value="song" 想传递到页面上)

Java代码 复制代码 收藏代码
  1. public class Login extends ActionSupport {
  2. private String username;
  3. public String execute() throws Exception {
  4. return INPUT;
  5. }
  6. public String getUsername() {
  7. return username;
  8. }
  9. public void setUsername(String username) {
  10. this.username = username;
  11. }
  12. }
public class Login extends ActionSupport {

    private String username;
    
    public String execute() throws Exception {
        return INPUT;
     }

    public String getUsername() {
        return username;
     }

    public void setUsername(String username) {
        this.username = username;
     }

}

下面是页面上显示username的一些尝试:
=========直接把值显示出来 。。。========
1.s:property 标签

Xml代码 复制代码 收藏代码
  1. <s:property value="username"/>

2.$ 符号表达式

Ognl代码 复制代码 收藏代码
  1. ${username}

上面的两种方式都是可以显示"song"出来的,如果只用来显示,推荐${username} ,简单明了。不过${} 不可以放在struts2 自带的<s:xxx > 标签中混用,会报不支持变量表达式异常 。

========== 用# 试一下 。。。==============
1.# 表达式

Ognl代码 复制代码 收藏代码
  1. #username

失败,页面输出 "#username"


2.s:property 标签1:

Html代码 复制代码 收藏代码
  1. <s:property value="#username"/>
<s:property value="#username"/> 

失败,页面无输出


3.s:property 标签2:

Html代码 复制代码 收藏代码
  1. <s:property value="#request.username"/>
<s:property value="#request.username"/>

成功,页面输出"song"(这种属性放进了request中)


4.s:property 标签3:

Html代码 复制代码 收藏代码
  1. <s:property value="#session.username"/>
<s:property value="#session.username"/>

失败,页面无输出(没有放到session中)


========= 用% 试一下 。。。==========

1.% 表达式

Ognl代码 复制代码 收藏代码
  1. %{username}

失败,页面输出"%{username}"


2.% 表达式

Ognl代码 复制代码 收藏代码
  1. %{'username'}

失败,页面输出 "%{'username'}"


3.s:property 标签4:

Html代码 复制代码 收藏代码
  1. <s:property value="%{username}"/>
<s:property value="%{username}"/>

成功,页面输出"song"


4.s:property 标签 Error4:

Html代码 复制代码 收藏代码
  1. <s:property value="%{'username'}"/>
<s:property value="%{'username'}"/>

失败,页面输出"username"


测试了一大把,最后总结出了4 种拿到值得办法:
<s:property value="username"/>
${username}
<s:property value="#request.username"/> (#session. #application.类似)
<s:property value="%{username}"/>

六、 struts.xml 中的 include 标签和package 标签以及 action 标签的 name 属性

struts.xml中的<include/>标签
当系统变大后,可能会导致struts.xml 内容非常多,这时我们就可以采用模块化 的方式
将不同的配置文件分散在不同的配置里面,然后由struts.xml将它们统一的加载进来
比如struts_1.xml 、struts_2.xml 、struts_3.xml 三个文件,分别是针对不同模块的配置
最后就可以由struts.xml统一将其整合起来,整合的方式就是把这它们包含进来即可
<include file="struts_1.xml"/><include file="struts_2.xml"/><include file="struts_3.xml"/>

在struts_1.xml 或者struts_2.xml 中的配置方式与struts.xml 中的配置方式是一模一样 的
即它们顶部都必须有 XML声明 和DTD ,它们DTD都是相同的,接下来是<struts/>根元素

即不能认为struts_1.xml 是被包含文件,便将顶部XML声明和DTD省略掉,这是不可以的
最后由struts.xml统一引入,于是系统加载,便将struts_1.xml及struts_2.xml等的配置都加载到内存中
这就相当于进行模块化的配置。对于大中型的系统来说,是不可避免的会使用模块化的配置方式的


struts.xml中<package name="#"/>的命名
其中struts.xml中<package/>的name 可随意命名,不会影响到其它的任何东西
它的name属性的作用仅仅是用来标识<package/> 的,以便另外的<package/>可以继承 它


<package name="struts-default" abstract="true">
在struts-default.xml的第73行配置<package/>时,声明了一个abstract="true" 属性
我们发现这个包中声明了结果类型、拦截器等等,却唯独没有声明<action/> 的配置
但是在我们自己定义的struts.xml 中有若干个<action/>的配置
因此abstract="true" 表示当前包是抽象包,所以当前包中不允许出现<action/> 的配置
抽象包的作用极类似于Java抽象类。自己不能实例化,只能被继承,然后由子类实现它的若干方法,最后由子类实例化
所以struts-default包中不能包含任何<action/>定义,具体的定义则是由其子包来定义的


<package name="struts2" extends="struts-default">中的extends的含义
Struts2中可以用包机制 区分不同的Action,而将功能相似 的Action放到一个package 中
类似于Java中包的机制,不同的是Struts2的包支持多继承 ,如下所示
<package name="struts2" extends="struts-default, jfreechart-default">

并且Struts2的package之间,又是可以实现继承 关系的
继承之后就可以把被继承的package中的所有东西都拿来使用了
所以它就相当于将<package name="struts-default"/> 的全部东西都继承过来了
于是才可以直接把struts-default.xml 包中的所有结果类型、拦截器等都拿来供我们使用
如果我们的包不继承Struts2提供的struts-default包,那么我们很多工作都会变得无法完成
在Struts2应用启动时会自动读取struts-default.xml ,将该文件定义的所有东西加载到内存中

接下来再加载当前应用的struts.xml 文件,然后将内存中struts-default.xml的信息读取过来
然后才会加入到我们当前的应用中,并且在default.properties 的第180行和181行有如下代码
### A list of configuration files automatically loaded by Struts
struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml
翻译
:被Struts自动加载的一个配置文件列表
应用启动时加载顺序是:先加载struts-default.xml ,次之struts-plugin.xml ,最次struts.xml

因此:后者中的配置信息就可以覆盖掉前者中的配置信息


<package/>的namespace属性
若未配置<package/>标签的namespace属性,则相当于namespace="" ,表示当前package位于默认命名空间里
命名空间要以斜线开头 ,假设包的namespace="/hello" ,且表单action="login" ,然后在页面中点击提交 按钮
这时在页面中将显示The requested resource (/struts2/login) is not available

这时可将表单改为action="/hello/login" 或在表单中使用namespace和action属性分开来写
即<form action="login" namespace="/hello"> ,注意此时若写成login.action则会出错

修改完表单action后,再次提交时显示的却是The requested resource (/struts2/hello/login) is not available

这是因为根本就不存在这个路径,正确的路径应该是/struts2/hello/login.action

所以配置包的namespace后,须手工添加action后缀,即action="/hello/login.action"

再次提交则正常显示,且浏览器显示的是http://127.0.0.1:8088/struts2/hello/login.action

另外
:假设发送action="/test/login.action" 请求,但struts.xml 中根本就没有 命名空间为test 的包
当Struts2发现该命名空间不存在时,它会到默认命名空间 下寻找login的<action/> 的信息
假设发送action="/hello/login.action" 请求,当/hello 的namespace下不存在login.action时
Struts2会尝试到默认的命名空间下去寻找有没有名字叫做login的<action/>信息
若默认命名空间下不存在名为login的<action/>的信息,则会报告资源找不到的错误


Struts2还支持根命名空间【"/"】
当直接请求contextPath 下的资源时,它会先到根命名空间 下寻找匹配的Action
例如请求http://127.0.0.1:8088/project/BB.action 时,Strtus2会首先到"/" 命名空间下去找这个Action
服务器的根
是http://127.0.0.1:8088/
网 站的根
是http://127.0.0.1:8088/struts2_demo/
假设JSP中写成<a href=“/login.jsp”></a> ,则实际指向 的是http://127.0.0.1:8088/login.jsp

即JSP中的根 指的是服务器的根 。而命名空间的斜杠 代表网站的根 ,也叫项目的根 或者应用的根


struts.xml中<action/>的name值的开头不允许加斜杠
这是由default.properties 的第109行属性决定,即struts.enable.SlashesInActionNames 默认为FALSE

比如说在struts.xml中,不指定<package/>的namespace属性,并写成<action name="hello/login">

再在表单中写成action="<%=request.getContextPath()%>/hello/login.action" ,此时仍可正常访问
但要注意:此时不能写成<action name="/hello/login"/> ,否则在运行时仍会报告404错误

总之直接使用命名空间就是了,不建议修改struts.enable.SlashesInActionNames 属性,保持默认配置即可


七、 Spring整合Struts2的两种方案(struts2,spring整合)

一、 需要的 JAR 文件为: Spring 和 Struts2 框架本身需要的 JAR 文件以及他们所依赖的 JAR 文件,比如 commons-logging.jar 等等,另外还需要 Struts2 发布包中的 struts2-spring-plugin-x.xx.jar 。

二、 在 web.xml 中增加 WebApplicationContext 的相应配置,以下两种配置方式本质是一样的。
1. Servlet 2.3 及以上版本可以使用监听器,相应配置如下:

Xml代码 复制代码 收藏代码
  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  7. </listener>

如果spring 配置文件被命名为applicationContext.xml ,并且放在WEB-INF 目录下,则不需要配置<context-param> ,因为ContextLoaderListener 默认在WEB-INF 目录下寻找名为applicationContext.xml 的文件。若存在多个Spring 配置文件,则在<param-value> 中依次列出,之间以逗号隔开。


2. Servlet 2.3 以下版本由于不支持<listener>,需要配置<servlet>,格式如下:

Xml代码 复制代码 收藏代码
  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
  4. </context-param>
  5. <servlet>
  6. <servlet-name>contextLoaderServlet</servlet-name>
  7. <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>

如果spring 配置文件被命名为applicationContext.xml ,并且放在WEB-INF 目录下,则不需要配置<context-param> ,因为ContextLoaderListener 默认在WEB-INF 目录下寻找名为applicationContext.xml 的文件,或者是名字为contextConfigLocation 的ServletContext 参数所指定的文件。由于该Servlet 配置只是为了在容器启动时能启动ContextLoaderServlet 使其工作,而不需要引用该Servlet ,所以不需要配置<servlet-mapping> 。


三、 在 web.xml 中完成加载 WebApplicationContext 之后,接下来就可以做到 Spring 和 Struts2 的整合了。整合有两种方法,分别叙述如下:
1. 第一种实现方法:
1) 将 Struts 的业务逻辑控制器类配置在 Spring 的配置文件中,业务逻辑控制器中引用的业务类一并注入。注意,必须将业务逻辑控制器类配置为 scope=”prototype”!
示例如下:

Xml代码 复制代码 收藏代码
  1. <bean id=”LoginAction” class=”yaso.struts.action.LoginAction”>
  2. <property name=”loginDao” ref=”LoginDao”/>
  3. </bean>

2) 在 struts.xml 或者等效的 Struts2 配置文件中配置 Action 时,指定 <action> 的 class 属性为 Spring 配置文件中相应 bean 的 id 或者 name 值。示例如下:

Xml代码 复制代码 收藏代码
  1. <action name=”LoginAction” class=”LoginAction”>
  2. <result name=”success”>/index.jsp</result>
  3. </action>


2. 第二种实现方法:

1) 业务类在 Spring 配置文件中配置,业务逻辑控制器类不需要配置,Struts2 的 Action 像没有整合 Spring 之前一样配置,<action> 的 class 属性指定业务逻辑控制器类的全限定名。
2) 业务逻辑控制器类(action) 中引用的业务类 不需要自己去初始化,Struts2 的 Spring 插件会使用 bean 的自动装配将业务类注入进来 ,其实业务逻辑控制器也不是Struts2 创建的,而是 Struts2 的 Spring 插件创建的 。默认情况下,插件使用 by name 的方式装配,可以通过增加 Struts2 常量来修改匹配方式:设置方式为:struts.objectFactory.spring.autoWire = typeName,可选的装配参数如下:
a) name:等价于Spring配置中的autowire=”byName”,这是缺省值。
b) type:等价于Spring配置中的autowire=”byType”。
c) auto:等价于Spring配置中的autowire=”autodetect”。
d) constructor:等价于Spring配置中的autowire=” constructor”。


四、 如果原先在Struts2中使用了多个object factory,则需要通过Struts2常量显式指定object factory,方式如下:struts.objectFactory = spring;如果没有使用多个object factory,这一步可以省略。


五、 可以通过设增加Struts2常量来指定是否使用Spring自身的类缓存机制。可以设定的值为true或false,默认为true。设置方式为:struts.objectFactory.spring.useClassCache = false。


六、 至此,完成了两种方式的整合。比较这两种整合方式,其本质是一样的。不同之处在于,使用第二种自动装配的方式时,由于没有在Spring中配

在web.xml
里面设置

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

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
----------struts2的action请求设置

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/application.xml,/WEB-INF/spring/applicationDao.xml
,/WEB-INF/spring/applicationAction.xml,/WEB-INF/spring/applicationService.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

配置spring管理相关组件。。

例如:

web.xml

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  6. id="WebApp_ID" version="2.5">
  7. <display-name>unkou</display-name>
  8. <filter>
  9. <filter-name>loginCheck</filter-name>
  10. <filter-class>
  11. jp.or.nhk.ssp.common.interceptor.LoginCheckInteceptor
  12. </filter-class>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>loginCheck</filter-name>
  16. <url-pattern>/manual/*</url-pattern>
  17. <url-pattern>/guide/*</url-pattern>
  18. </filter-mapping>
  19. <filter>
  20. <filter-name>struts2</filter-name>
  21. <filter-class>
  22. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  23. </filter-class>
  24. </filter>
  25. <filter-mapping>
  26. <filter-name>struts2</filter-name>
  27. <url-pattern>/*</url-pattern>
  28. </filter-mapping>
  29. <listener>
  30. <listener-class>
  31. org.springframework.web.util.Log4jConfigListener
  32. </listener-class>
  33. </listener>
  34. <listener>
  35. <listener-class>
  36. org.springframework.web.context.ContextLoaderListener
  37. </listener-class>
  38. </listener>
  39. <context-param>
  40. <param-name>contextConfigLocation</param-name>
  41. <param-value>
  42. /WEB-INF/spring-config/spring-context.xml
  43. </param-value>
  44. </context-param>
  45. <context-param>
  46. <param-name>log4jConfigLocation</param-name>
  47. <param-value>file:/opt/ssp/sspu/conf/log4j.xml</param-value>
  48. </context-param>
  49. <context-param>
  50. <param-name>log4jRefreshInterval</param-name>
  51. <param-value>60000</param-value>
  52. </context-param>
  53. <context-param>
  54. <param-name>log4jExposeWebAppRoot</param-name>
  55. <param-value>false</param-value>
  56. </context-param>
  57. </web-app>
Struts2框架中的路径问题深入解析 Struts2作为一个广泛使用的Java Web应用程序框架,从其前身Struts1开始,已经发展成为了一个成熟且功能丰富的MVC(Model-View-Controller)框架。Struts2不仅继承了Struts1的稳定性和易用性,还引入了WebWork框架的先进特性,使得开发者能够更方便地构建可维护、可扩展的Web应用程序。从最初的版本到如今的稳定版,Struts2的演进伴随着IT技术的发展,满足了不断变化的业务需求和技术挑战。 阅读详情

相关推荐

Linux系统监控实战:夜莺监控+categraf采集器配置全流程(附常见问题排查)

本文详细介绍了在Linux系统中使用夜莺监控和categraf采集器进行系统监控的全流程配置,包括环境准备、核心配置文件(如config.toml和procstat.toml)详解、服务集成与验证、高级监控配置实战以及常见问题排查。通过实战案例和优化建议,帮助运维人员快速构建高效的监控体系。

xray4的博客 737

struts2 常量配置详解

1,struts.action.extension 作用:设置为htm的时候, 把url后缀为htm的映射成为action 源码:org.apache.struts2.dispatcher.mapper.DefaultActionMapper   Java代码   @Inject(StrutsConstants.STRUTS_ACTION_EXTE

psiitoy的专栏 1269

利用HFSS仿真优化圆极化微带天线的耦合馈电设计

本文深入探讨了利用HFSS仿真软件优化圆极化微带天线性能的关键方法。通过对比传统直接馈电与耦合馈电方式,详细阐述了耦合馈电在提升阻抗匹配、改善轴比带宽及增强设计鲁棒性方面的显著优势。文章结合FR4板材的实战案例,逐步演示了在HFSS中建立模型、进行参数扫描与圆极化性能优化的完整流程,为设计高性能、高纯度的圆极化天线提供了实用指南。

weixin_29233333的博客 547

struts2-core-2.2.1.1.jar!/struts-default.xml:29:72

Bean type class com.opensymphony.xwork2.ObjectFactory with the name xwork has already been loaded by bean - jar:file:/F:/Workspaces/MyEclipse%208.x/.metadata/.me_tcat/webapps/test04/WEB-INF/lib/stru

a510750的专栏 1万+

ROBOGUIDE教程:FANUC机器人X型焊枪气动点焊焊接

FANUC机器人X型焊枪气动点焊焊接虚拟仿真实现方法。

IndRobSim 4387

用 ABAP 的 AMDP 把计算推到数据库:概念、场景、以及可运行示例

摘要:AMDP(ABAP Managed Database Procedures)是SAP HANA环境下优化ABAP性能的关键技术,通过将数据计算逻辑推送到数据库端执行,减少数据传输和应用层处理开销。其核心价值在于利用HANA的集合运算能力,适用于大数据量聚合、窗口函数等复杂计算场景。AMDP不是通用解决方案,而是针对CDS无法高效处理的特定性能瓶颈的优化手段。典型应用包括财务统计、零售分析等需要高性能数据处理的业务场景。本文通过概念解析、性能逻辑推导和实际代码示例(包括直接调用的AMDP Procedu

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 264

struts-default.xml

 struts-default.xml是Struts2框架的基础配置文件,为框架提供默认的设置。这个文件包含在struts2-core-2.0.11.jar中,由框架自动加载。 struts-default.xml文件会自动被包含到struts.xml文件中,以提供标准的配置设置而不需要复制其内容。 配置struts.xml文件时,给出了下面这句代码:  strut

flfna的专栏 6435

RK3576 PCIE接口调试:基于RTL8111HS的网卡驱动移植

检查项方法电源电压复位时序检查设备树 reset-gpios链路速率设备识别lspci -vvv驱动加载。

小灰灰的博客 739

解决Struts2报错!!Unable to load configuration struts2-core-2.2.3.jar!/struts-default.xml:29:72报错

直接看报错, Unable to load configuration  后面有一串地址, 根据这个地址就能找到两个  Struts2-core-xxxxx.jar  包,选择其中的一个删除,这样就不会报错了。 但是有可能你删除完之后运行tomcat还是这个问题报错,那就是另外的包也重复了!! 以此类推。。

Luminary951223的博客 2万+

基于 ESP32 的宿舍洗浴热水余量预测与智能排队提醒系统设计与实现

本系统以 ESP32 为主控核心,通过超声波液位传感器实时监测储热水箱剩余水量,配合 DS18B20 温度传感器采集水温数据,建立热水余量预测模型估算可用洗浴时长;同时通过红外人体传感器统计浴室排队人数,结合人均洗浴时长计算预计等待时间,并通过 OLED 屏本地显示 + WiFi Web 服务器远程推送的方式实现排队提醒功能。

weixin_42300449的博客 45

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

我好像病了的博客 379

二、struts2.0相关配置问题

首先从官网下载相关示例,获得相关struts2的jar包,引入jar后可进行下面相关开发。 struts2官网地址 可参考相关api路径:struts-2.3.20/docs/docs/guides.html 1.web.xml相关配置 <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/n

空灵的专栏 394

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

配置Struts2相关问题

月 20, 2017 1:29:29 下午 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error 严重: Could not find action or result /computerRoom/ There is no Action mapped for namespace [/] and action name

wuchao_codingforever的博客 663

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Struts2要点复习之三--异常配置、值栈、通用标签相关问题

异常配置相关问题1.异常配置包括哪两种配置?分别如何配置,请具体回忆。2.异常是通过哪个类进行处理的?异常信息在值栈中是如何放置的?如何在页面中获取报错信息?3.Struts2自动将Action对象放入到值栈的时间点是什么?请回忆。4.回忆通用标签,[property 标签](https://blog.csdn.net/a1773570500/article/details/105223283)、...

a1773570500的博客 280

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

关于Struts1.2配置文件的Action访问路径相关问题

、如果是简单的单一的一个 struts—config.xml 文件 (或者项目中所有的struts配置文件直接都在WEB-INF目录下)对应的Action的访问路径path设置就是对应页面中访问该Action的路径如:    name="BrdBaseForm"    parameter="method"    path="/BrdMgrAction"    scope="request"    type="com.netcast.zb.prg.struts.action.brd_mgr.BrdMgrAct

xuliangwen的专栏 3088

Struts2 的配置及问题处理

新建一个动态web项目 在WebContent/WEB-INF/lib 目录导入 Struts2 相关包 structs.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.5.d

曼曼的博客 213

通过配置struts.xml解决 struts2和 dwr兼容的问题

[size=medium]众所周知,strust2 通过在 [color=blue]web.xml[/color]中配置 filter,对[color=red][b]所有路径[/b][/color]的请求进行过滤。 代码如下:[/size] [code="java"] struts2 org.apache.struts2.dispatcher.ng.filter...

iteye_3352的博客 164

struts2配置常见异常

struts2配置常见异常  点击打开链接

u010032148的专栏 402

struts配置问题

java.lang.UnsupportedClassVersionError: org/apache/struts2/dispatcher/filter/StrutsPrepareFilter : Unsupported major.minor version 51.0 (unable to load class org.apache.struts2.dispatcher.filter.Strut...

aJiefy的博客 338

struts2学习中遇到的问题1

来源于java视频教程高级教程day37 struts2流程: 开发流程: 1 创建javaweb工程 2 找到开发Struts2应用需要使用到的jar文件. 3 创建jsp文件. 4 创建action文件 5 编写Struts2的配置文件 6 在web.xml中加入Struts2 MVC框架启动配置 1,2,3 4  package cn.i

bailin710258的专栏 1145

使用struts2.5版本遇到的问题

使用struts2.5版本遇到的问题 分类:Java(8468) (4) 举报 收藏我的环境 Eclipse JavaEE |1.8JDK |Tomcat8.0| 动态web项目3.1| struts2.5.2struts相关包 我使用的是struts2.5.2版本,是目前的最新版本。需要的核心包如下: 其实包是看你自己需要,比如struts2-convention-pl

加金开发 461

struts2和DWR的整合问题

struts2和DWR的整合问题 工程在调用DWR时会报错:There is no Action mapped for action name XXX。 在网上找的问题是dwr的路径被包含进struts。 解决办法是在struts.xml中加入 你这样吧: 加这个,这表示所有调用struts的action都要带有后缀.action 这样一来,你调用dwr里的方法就不会转到s

lijianjh的专栏 634

spring整合struts2 以及 会遇到的问题

新手配置struts2和spring可以跟着创建,有问题可以评论区或者私聊,需要jar包也可以私聊我,免费提供哦。

m0_55995610的博客 634
上一篇: 启动Tomcat报异常host-manager does not exist or is not a readable directory
下一篇: struts2出现at com.opensymphony.xwork2.util.FileManager$FileRevision.needsReloading(FileManager.java:20
zi_jun
博客等级 码龄18年 109粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值