GVKun编程网logo

jQuery Struts2的struts-plugin.xml无效(jquery is visible)

16

对于jQueryStruts2的struts-plugin.xml无效感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍jqueryisvisible,并为您提供关于Action的实现方式和str

对于jQuery Struts2的struts-plugin.xml无效感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍jquery is visible,并为您提供关于Action的实现方式和struts.xml配置的详细解释,Struts2的简单执行过程(二)、com.google.inject.struts2.Struts2GuicePluginModule的实例源码、Java:struts2之struts.xml 配置详解整理........ing、Java基础101 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能的有用信息。

本文目录一览:

jQuery Struts2的struts-plugin.xml无效(jquery is visible)

jQuery Struts2的struts-plugin.xml无效(jquery is visible)

我设置了一个项目,该项目是Struts2 + Springs + JPA的组合。

我最近遇到了Struts2-Jquery插件

在我的项目中使用此插件(struts2-jquery-plugin-3.5.1.jar)时出现错误

Unable to load jar:file:/H:/My%20Project/phase1/build/web/WEB-INF/lib/struts2-jquery-plugin-3.5.1.jar!/struts-plugin.xml - Class: java.net.PlainSocketImplFile: PlainSocketImpl.javaMethod: connectLine: 195 - java/net/PlainSocketImpl.java:195:-1    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:909)    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:154)    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:121)    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:179)    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)    ... 48 more Caused by: java.net.UnknownHostException: struts.apache.org        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)        at java.net.Socket.connect(Socket.java:529)        at java.net.Socket.connect(Socket.java:478)        at sun.net.NetworkClient.doConnect(NetworkClient.java:163)        at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)        at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)        at sun.net.www.http.HttpClient.<init>(HttpClient.java:233)        at sun.net.www.http.HttpClient.New(HttpClient.java:306)        at sun.net.www.http.HttpClient.New(HttpClient.java:323)        at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)        at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677)        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315)        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1282)        at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:283)        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1194)        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090)        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1003)        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)        at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)        at com.opensymphony.xwork2.util.DomHelper.parse(DomHelper.java:113)        ... 53 more

给这个特殊的错误将溶液这里作为Struts2的DTD问题。

在上述链接中给出的解决方案中起作用..更新了我的webapp lib文件夹中的三个库:

  • Struts2-核心-2.3.4.1
  • struts2-spring-plugin-2.3.4.1
  • xwork-core-2.3.4.1

在此更新后尝试部署时,我得到了这个堆栈跟踪

SEVERE: Exception starting filter struts2java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:209)    at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:102)    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:210)    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:390)    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437)    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51)    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:103)    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4649)    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5305)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618)    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:650)    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:531)    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1468)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)    at java.lang.reflect.Method.invoke(Method.java:597)    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1436)    at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:856)    at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:353)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)    at java.lang.Thread.run(Thread.java:662)Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)    ... 52 more

谁能给我指点我哪里出问题了?

答案1

小编典典

您需要将添加commons-lang3-3.x.jar到您的类路径中以运行过滤器。

您必须确保您也没有多个版本commons-lang3-x.x.jar

commons-lang3-x.x.jarcommons-lang-x.x.jar相反可以在同一类路径中共存,因为package是不同的(他们是故意的;)


由于 NoClassDefFoundError ,这可以知道:

java.lang.NoClassDefFoundError:org / apache / commons / lang3 / StringUtils。

这主要发生在两种情况下:

  • 在运行时,您没有该库,
  • 或者您有两个版本的库,因此类加载器不知道选择哪个,并引发异常。

包中的lang3表示缺少的StringUtils类是from common-lang3-*.jar而不是from common-lang-*.jar

Action的实现方式和struts.xml配置的详细解释,Struts2的简单执行过程(二)

Action的实现方式和struts.xml配置的详细解释,Struts2的简单执行过程(二)

我把你的头像,设置成我的名字,此刻你便与我同在。

我把你的名字,写进我的代码里面,以后,我的世界便存在着你。

 


 

 

  “两个蝴蝶飞”特别喜欢"java1234知识分享网"小峰的实用主义,所以本文及其系列文章均是采用实用主义,从项目和代码的角度去分析。由于本人经验有限,嘴皮子不溜,所以学术性,概念性,底层性的知识点暂时不做介绍。文章中有错误之处,欢迎拍砖和指点。特别感谢"java1234知识分享网 "和"黑马程序员官网",所有的资料大部分是两者提供,为了方便书写,故不一一指名出处,请谅解,非常抱歉。

 

上一章简单介绍了Struts2的开发"Hello World",如果没有看过,请观看上一章

 

一   Action的实现方式

上一章开发的HelloAction,并没有继承任何类或者实现任何接口,但是必须有一个execute() 方法,方法返回值也必须是String类型,代码不具体侵入性,但是并不能使人看得出这个类是干什么的,甚至不能区分这个类与普通的Java类有什么区别,所以不具有规范性。 我们开发者在开发的时候,希望自己写的这个Action类能够具有规范性,且已经支持某些功能。

一.一  第一种实现方式(普通Java类,里面包含execute()方法)

package com.yjl.web.action;
import org.apache.log4j.Logger;
/**
* @author 两个蝴蝶飞
* @version 创建时间:2018年8月23日 上午9:41:32
* @description 第一种实现方式,普通java类,
* 有一个execute()方法,也可以多写几个方法,用action中的标签method来控制,可以正常访问。
*/
public class Hello1Action {
    private static Logger logger=Logger.getLogger(Hello1Action.class);
    public String execute() {
        logger.info("两个蝴蝶飞,web层你好");
        return "success";
    }
}

没有侵入性,但不具有开发时要求的规范性,且不支持某些struts自带的功能。

一.二  第二种实现方式(实现Action接口)

package com.yjl.web.action;
import com.opensymphony.xwork2.Action;
/**
* @author 两个蝴蝶飞
* @version 创建时间:2018年8月23日 上午10:54:03
* @description 第二种实现方式,实现Action接口,重写里面的execute()方法
* 有一个execute()方法和五个String类型的常量
*/
public class Hello2Action implements Action{
    @Override
    public String execute() throws Exception {
        return Action.SUCCESS;
        //return Action.ERROR;
        //return Action.LOGIN;
        //return Action.NONE;
        //return Action.INPUT;
    }
}

 

注意,Action接口是xwork2包下的接口。

实现了Action接口,使开发者能够看出来这是一个Action,具有了一定程度上的开发规范,但是是Action接口,所以必须要重写execute()方法。 一般自己写Action,构思好之后上来就直接add(), edit(), delete(). select() 这些业务方法,每次都要重写execute()方法,不太方便。 而且这种方式不具有struts2中某些功能,如验证框架和国际化。 Action中接口中有五个常用的结果字符串(好多方法都返回success,error,login,故将其封装了一下) .这些字符串虽然是大写,然而真实的值是全部小写.

 

package com.opensymphony.xwork2;
 
public abstract interface Action
{
  public static final String SUCCESS = "success";
  public static final String NONE = "none";
  public static final String ERROR = "error";
  public static final String INPUT = "input";
  public static final String LOGIN = "login";
  
  public abstract String execute()
    throws Exception;
}

一.三 继承ActionSupport类(官方推荐)

package com.yjl.web.action;
import com.opensymphony.xwork2.ActionSupport;
/**
* @author 两个蝴蝶飞
* @version 创建时间:2018年8月23日 上午11:04:20
* @description 第三种方式,继承ActionSupport类。
* ActionSupport类实现了Action接口,也有Action中的五个常量.
*/
public class Hello3Action extends ActionSupport{
    public String list() {
        return "list";
    }
}

继承了ActionSupport类,不需要重新写execute()方法,具备Action中的五个常量,并且这个ActionSupport类还实现了其他接口,

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable{
    
}

如验证框架(Validateable,ValidationAware),国际化(LocaleProvider)。 

以后开发中,使用ActionSupport框架。

二  struts.xml中节点的详细解释

在src下有一个struts.xml的配置文件,它配置所有开发者自己编写实现的Action,是struts2的核心,不能改变名称。注意,是struts.xml,并不是struts2.xml,并没有那个2。(Strut2虽然相对于struts是一个飞跃,与webwork更像一些,但有些基本的东西还是保留了,赞一个)。

在struts.xml中,最上面是一个约束,<struts></struts>是一个根节点。

二.一 修改常量节点 <constant></constant>

在struts-core.jar核心包下,有一个包org.apache.struts2包下,有一个default.properties属性文件,里面记录了很多常用的常量,

其中常见的有:

struts.i18n.encoding=UTF-8 
struts.multipart.maxSize=2097152
struts.action.extension=action,,
struts.enable.DynamicMethodInvocation = false
struts.devMode = false
struts.ui.theme=xhtml
struts.ognl.allowStaticMethodAccess=false

建议修改后的值为:

###国际化操作,编码格式为UTF-8
struts.i18n.encoding=UTF-8
###上传文件时最大的上传大小,默认为2M. 根据项目情况具体填写值,建议后面加两个00
struts.multipart.maxSize=209715200
###struts的访问后缀名
struts.action.extension=action
###struts是否可以访问静态方法
struts.enable.DynamicMethodInvocation =true
###struts是否是开发者模式
struts.devMode =true
###struts中ui标签的主题,建议为simple
struts.ui.theme=simple
###ognl中是否可以访问静态方法,为true
struts.ognl.allowStaticMethodAccess=true

可以在struts.xml中进行相应的修改,如

<!--修改国际化编码 -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <!--修改是否为开发者模式 -->
    <constant name="struts.devMode" value="true"></constant>

按照name,value值的形式进行填写。

也可以在src下新建一个struts.properties,然后将这些值放置进去,struts也会自动struts.propeties中的常量值的。

也可以在web.xml中,在<filter></filter>中,以<init-param></init-param>局部参数的形式传递进去。

建议使用第一种方式,在struts.xml中用<constant></constant>,毕竟这个文件常常打开,出错了也容易发现。

二.二 分模块开发<include file="" />

在实际的项目中,有很多的模块,如果所有的配置都放在一个struts.xml,那么一旦这个struts.xml被其他人误改错了一下,那么其他人的项目也是无法运行的,而且想配置自己模块的信息的时候,struts.xml太长,也不容易找,所以最好是分模块开发,利用<include file="具体文件名" /> ,类似 于jsp中的<include file="" />静态包含一样。 所以建议每一个模块都写一个模块.xml,然后在struts.xml中引入即可。如有三个模块 User模块和Class,Course,那么可以将User的配置放置在user.xml中,Class配置放置在class.xml中,course模块放置在course.xml,在struts.xml中只需要

<include file="user.xml"></include>
    <include file="class.xml"></include>
    <include file="course.xml"></include>

静态包含即可。 注意,file的文件路径引用。 正确的位置引用,点击ctrl+模块.xml时,可以正确地跳转到相应的.xml文件中。如果没有跳转和反应,那说明位置引用错误,重新检查一下。

二.三 最牛逼的节点<package>

在struts.xml配置文件中,最牛的节点就是package节点。 package,分包。 可以将action进行分包处理。将每一个action或者每一组action进行隔开,类似于java中package的概念。

<package> 节点的使用

<package name="hello" extends="struts-default" namespace="/">
        <!--具体的Action-->
</package>

package中name节点是package的名字,是独一无二的,不能够重复。 最好与模块名相同或者起一个有意义的名称。

extends节点表示继承,即package之间可以相互的继承,来避免重复化功能的编写。 默认为struts-default。 struts-default中struts已经定义了很多功能,开发者自己写的包只需要extends 这个包名struts-default,就拥有了struts已经定义好的功能。 如拦截器中的大量的功能。 用户也可以自己继承自己所写的包 。如父包名为<package name="parent" extends="struts-default">

那么子包只需要<package name="child" extends="parent">, child包不但拥有struts-default的功能,也拥有parent包中的特殊功能,这也是Java的多重继承的体现。 所以package的name也不能随便起。

namespace节点表示命名空间,以/开头,默认是"/" 。是为了在访问路径和访问请求url方面体现package的分包作用.  package中的name是在配置文件中体现分包,namespace是在url中体现分包。 如果action过多的话,namespace 最好与name名称一样,如果action少的话,也可以直接"/" . package中的namespace的值与action中name的值,共同构成了完整的访问请求路径。

<package></package> 子节点<action></action>节点的使用

在Hello3Action中定义两个方法,一个是list()查询,一个是add()添加的方法。

package com.yjl.web.action;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.ActionSupport;
/**
* @author 两个蝴蝶飞
* @version 创建时间:2018年8月23日 上午11:04:20
* @description 测试action标签中method的方法访问
*/
public class Hello3Action extends ActionSupport{
    private static final long serialVersionUID = 8737138848863458260L;
    Logger logger=Logger.getLogger(Hello3Action.class);
    public String list() {
        logger.info("执行list方法");
        return "list";
    }
    public String add() {
        logger.info("执行add方法");
        return "add";
    }
}

<action></action> 标签,有三个基本的属性,

<action name="list" class="com.yjl.web.action.Hello3Action"
        method="list">
 
</action>

其中name为action的名字,表示区别一个package包下的不同的action。 其中这个name的值,不应该随便取,应该是要访问的方法名。 在浏览器客户端输入的url:= /项目名/package的namespace/action的name值.action;

class为要访问的那个Action的全限定名称,是class,用.(点)进行分隔,不是/分隔。

method为要访问的那个方法,类 extends ActionSupport 后,有很多很多的方法,如list(), add(), delete()等,那么怎么知道具体要访问哪个方法呢? 用method这个属性. method="要方法的方法名" ,是方法名。

action还有一个节点是converter,表示所用的是哪一个类型转换器。(后面会有相应的解释)

在本实例了有两个方法,所以要进行写两个Action, 一个Action类中会有多个方法,难道要一个个配置多个Action吗? 

 

配置Action的三种形式:

第一种形式,通过配置method的属性完成

<action name="list" class="com.yjl.web.action.Hello3Action"
        method="list">
            
    </action>
  <action name="add" class="com.yjl.web.action.Hello3Action"
        method="add">
            
    </action>

 

缺点:  有几个方法,就要配置有几个action,然而方法一般有很多。 而且action的子节点<result>, 会造成一个action配置一个或者俩个result,造成大量的重复。

第二种形式, 通过通配符的配置完成。

<action name="Hello3_*" class="com.yjl.web.action.Hello3Action"
        method="{1}">
            
        </action>

name的值为: 类简写名(去掉Action后)_*   method中的值取第一个{1},从1开始,不是从0开始。

这样访问Hello3Action中的list方法,访问路径就是 Hello3_list

访问Hello3Action中的add方法,访问路径就是Hello3_add

非常简化了action的配置。

也有的人配置的更狠, 会配置成*_*, 即:

<action name="*_*" class="com.yjl.web.action.{1}Action"
        method="{2}">
            
        </action>

这样虽说更加简化了开发

User类中的list就是User_list, User类中的add就是User_add,

Class类中的list就是Class_list,Class类中的add就是Class_add

不建议这么写,如果这么写的话,访问的url必须是小写(即使与spring整合后可以写成小写,也不建议)。

action中配置的主要作用是关于对子节点result 的处理, 要具体要跳转到哪个路径或者哪个新的action。

这样配置的话,会造成result也必须要设置成这个模样(其实result也不建议设置成{} 占位符的方式),这样会乱。

User类的list方法的返回值与Class类中的方法返回值,无法区别,单纯的{1}是不行的,要result   name="{1}_{2}", 如果是type="chain"或者type="redirectAction"会更加麻烦。 建议只用一个通配符进行访问,Hello3_*这样形式,那么result就直接name={1}即可。

第三种形式:  动态方法访问

不是用{} 通配符,而是用! 号。 即:

UserAction中list方法()  url: userAction!list.action
UserAction中add方法()  url: userAction!add.action
ClassAction中list方法()  url: classAction!list.action
ClassAction中add方法()  url: classAction!add.action

这样访问也特别的方便。

这样的话, action中只需要配置name和class即可。 method已经由外部指定了,不需要写method的值了。

如果是UserAction的话,配置应该是:

<action name="userAction" class="com.yjl.web.action.UserAction" >
            
        </action>

ClassAction的话,配置应该是

 

<action name="classAction" class="com.yjl.web.action.ClassAction" >
            
        </action>

 

注意,动态方法访问默认是关闭的,想要开启需要改变一下struts.enable.DynamicMethodInvocation的值。

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

action子节点result的配置

result表示结果,是对方法的返回值进行相应的分析。有两个属性,name和type

<result name="success" type="dispatcher">/index.jsp</result>

 

其中name的值要与方法的返回值相同,如 list方法返回值是return SUCCESS,那么这个list方法的返回值对应的result的值就是

<result name="success"> ,如果返回是"hello", 那么这个name的返回值就是 <result name="hello">

如果在action中配置通配符, name=Hello3_*形式,method="{1}", 那么为了简化result的配置,可以将result配置成 name={1},

相应的.jsp, 也可以配置成/{1}.jsp。这样需要保证Action中方法的名称与返回值的名称相同,并且与跳转到的jsp的名称也要相同,

建议最好result还是一个个写出来吧。

result中type五种常见的形式, dispatcher(转发到jsp),redirect(重定向到jsp), chain(转发到另外一个方法),redirectAction(重定向到另外一个方法),stream(上传和下载流)

其中dispathcer和redirect是对jsp的操作,如果传递了数据,用dispather,没有传递数据,用redirect (区别见重定向与转发的区别)

chain,redirectAction是对action的操作,一般用于这同一个类中两个方法之间的跳转,即同一个package包下的跳转,都是用redirectAction的。

如add()添加成功之后,需要跳转到list()方法进行显示,这时为:

<result name="add" type="redirectAction">Hello3_list</result>

地址url也会相应的改变,如果是chain的话,地址栏是不会改变的,重新点击的话,会重新添加一个一样的数据。(当然id主键还是不同的)。

如果是不同包之间的action的跳转呢?

        <result name="add" type="redirectAction">
                <!-- 要跳转到哪一个命名空间,即哪一个包 -->
                <param name="namespace">/class</param>
                <!-- 要跳转到哪一个Action 不加后缀 -->
                <param name="actionName">Hello2Action</param>
                <!-- 跳转到哪一个方法 -->
                <param name="method">list</param>
                <!-- 可能要传递的参数. 用ognl表达式,根据情况添加 -->
                <param name="id">${id}</param>
            </result>

可以带参,也可以不带参数传递。

  全局结果页面与局部结果页面。

 这个全局是相对于package来说的,是package中的全局,并不是所有的struts.xml中的全局,所以全局结果的节点位置应该放在package节点里面,与action节点平行。 用<global-results> </global-result> 节点。

常用的全局结果页面有, error错误页面,页面出错了都显示这个页面,

login 登录页面, 如果没有登录,输入任何url都会跳转到login页面

noprivilege   没有权限页面,如果用户没有权限访问了某一个页面,会给出相应的提示。

<global-results>
            <result name="error">/error/error.jsp</result>
            <result name="login">/login.jsp</result>
                <result name="noprivilege">/noprivilege.jsp</result>
        </global-results>

当全局结果页面与局部结果页面发生冲突时,以局部结果页面为准。 与全局变量与局部变量一致。

三   Struts2的执行流程

当用户在客户端发送一个请求后,如常用的标准的http://localhost:8080/Struts_Hello/user/User_add.action时,

会经过前端控制器(StrutsPrepareAndExecuteFilter) 过滤器,执行一连串的过滤器链,然后根据user 找到了对应的package的namespape,进入到具体的package包下。 利用通配符的方式进行访问,User_add会进行匹配相应的action,根据class和method找到是哪一个类的哪一个方法,在实例化类Action之前,会先执行拦截器。通过反射实例化类,运行方法, 方法运行成功之后,有一个返回值,这个返回值会与刚才action下的<result> 中的name进行相应的匹配,匹配到哪一个,就执行哪一个result。 如果是diapatcher或者redirect,就显示到相应的.jsp页面(带有数据), 如果是chain或者redirectAction,那么就去执行那一个方法(如A,给的是action的name,会去找action),那个方法(A)执行完毕回来后,就找A下面的result进行匹配,匹配成功之后进行返回。

执行过程图如下:

 

 

原文出处:https://www.cnblogs.com/yjltx/p/11053942.html

com.google.inject.struts2.Struts2GuicePluginModule的实例源码

com.google.inject.struts2.Struts2GuicePluginModule的实例源码

项目:guice    文件:ExampleListener.java   
public Injector getInjector() {
  return Guice.createInjector(
      new Struts2GuicePluginModule(),new ServletModule() {
        @Override
        protected void configureServlets() {
          // Struts 2 setup
          bind(StrutsPrepareAndExecuteFilter.class).in(Singleton.class);
          filter("/*").through(StrutsPrepareAndExecuteFilter.class);

          // Our app-specific code
          bind(Service.class).to(ServiceImpl.class);
        }
      });
}
项目:guice-old    文件:ExampleListener.java   
public Injector getInjector() {
  return Guice.createInjector(
    new Struts2GuicePluginModule(),new ServletModule() {
      @Override
      protected void configureServlets() {      
        // Struts 2 setup
        bind(StrutsPrepareAndExecuteFilter.class).in(Singleton.class);
        filter("/*").through(StrutsPrepareAndExecuteFilter.class);

        // Our app-specific code
        bind(Service.class).to(ServiceImpl.class);
    }
  });
}
项目:google-guice    文件:ExampleListener.java   
public Injector getInjector() {
  return Guice.createInjector(
    new Struts2GuicePluginModule(),new ServletModule() {
      @Override
      protected void configureServlets() {      
        // Struts 2 setup
        bind(StrutsPrepareAndExecuteFilter.class).in(Singleton.class);
        filter("/*").through(StrutsPrepareAndExecuteFilter.class);

        // Our app-specific code
        bind(Service.class).to(ServiceImpl.class);
    }
  });
}

Java:struts2之struts.xml 配置详解整理........ing

Java:struts2之struts.xml 配置详解整理........ing

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

    
<!--  include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用  -->
    
< include  file ="struts-default.xml" ></ include >
   
    
<!--  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" >
        
< interceptors >
            
<!--  定义拦截器 
                name:拦截器名称
                class:拦截器类路径
             
-->
            
< 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 >

Java基础101 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能

Java基础101 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能

1、效果图示  

分享图片

横线上方的部分不动(没有刷新),下方实现刷新(异步刷新)

2、实现步骤  

jquery+ajax+struts技术实现异步刷新功能的步骤:
    1、需要用到 jquery+ajax+struts 那么需要用几个包:(commons-logging-1.0.4.jar、freemarker-2.3.13.jar、ognl-2.6.11.jar、struts2-core-2.1.6.jar、xwork-2.1.2.jar、commons-fileupload-1.2.1.jar)
                  说明:  需要的包  六个基本包外加  json-lib.jar,struts2-json-plugin.jar,ezmorph.jar 这三个包
    
    2、加入 jquery.js ,调用 jquery里面的 ajax方法,$.get()、$.post()、$.getJSON();
    
    3、Action中 写 JSONObject
                          先将所有的值存入map中 ,然后将map集合转换为json对象
         JSONObject jo = JSONObject.fromObject(map);
    
    4、struts.xml中  设置result 的type=json  并且指定输入的 数据名称
        <result name="success" type="json">  
            <param name="root">outinfo</param>   
        </result>

3、相关代码  

页面端(index.jsp)

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>  
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
 3 <html>  
 4     <head>  
 5         <Meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
 6         
 7           <script type="text/javascript" src="js/jquery.js" ></script> 
 8           
 9           <script type="text/javascript">
10               $( function() {     
11                 //使用 Ajax 的方式 判断登录  
12                 $("#btn_login").click( function() {     
13                     var url = ‘ajaxLogin.action‘;  
14                     //alert("===");  
15  //获取表单值,并以json的数据形式保存到params中  
16                     var params = {  
17                         loginName:$("#loginName").val(),18                         password:$("#password").val(),19                     };
20                     
21                     /* //使用$.post方式          $.post(url,params,function(data){data},‘json‘);
22                     $.post(  
23  url,//服务器要接受的url  
24                         params,//传递的参数       
25  function cbf(data){ //服务器返回后执行的函数 参数 data保存的就是服务器发送到客户端的数据  
26  //alert(data); 
27  //eval里面的字符串以JavaScript的方式执行 //比如:eval(‘alert(‘你好!‘)‘); 
28  var member = eval("("+data+")"); //包数据解析为json 格式   
29  $(‘#result‘).html("欢迎您: "+member.name+" -密码:"+member.pwd);  
30  }, 
31  ‘json‘ //数据传递的类型 json  
32  ); 
33                     */
34                    
35                      //上面注释掉的部分,和下面三行代码的效果是一样的
36                      $.getJSON(url,function(data){ 
37                            var member = eval("("+data+")"); 
38                            $("#result").html("欢迎您哟:"+member.name+" -密码:"+member.pwd);
39                        });
40                 });  
41             });  
42         </script> 
43   </head>
44   
45   <body>
46        <span>用户名:</span>  
47        <input type="text" id="loginName" name="loginName">  
48        <br />  
49       
50        <span>&nbsp;&nbsp;&nbsp;码:</span>  
51        <input type="password" name="password" id="password">  
52        <br /> 
53       
54        <input type="button" id="btn_login" value="登录" /> 
55        
56        <br /> 
57        <hr/>
58        <p>  
59           这里显示ajax信息(即:异步刷新显示出下方的信息):  
60           <br /><br />  
61           <span id="result"></span>  
62        </p>  
63   </body>
64 </html>

struts.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="ajax" extends="json-default">  
 5         <action name="ajaxLogin" class="com.shore.ajax.ation.AjaxLoginAction">  
 6             <!-- 返回类型为json 在sjon-default中定义 -->  
 7             <result name="success" type="json">  
 8                 <!-- root表示返回对象的层级为根部 root的值对应要返回的值的属性 -->  
 9                 <!-- 这里的outInfo值即是 对应action中的 outInfo -->  
10                 <param  name="root">outinfo</param>  <!-- 输出到页面的信息,JavaScript函数中的data参数接收此值 -->
11             </result>  
12         </action>  
13     </package>  
14 </struts>  

Action层下的 AjaxLoginAction 类

 1 package com.shore.ajax.ation;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 import net.sf.json.JSONObject;
 7 
 8 import com.opensymphony.xwork2.ActionSupport;
 9 
10 /**
11  * @author DSHORE/2019-8-1
12  *
13  */
14 public class AjaxLoginAction extends ActionSupport {
15     // 用户Ajax返回数据  
16     private String outinfo;  //输出信息
17     
18     // struts的属性驱动模式,自动填充页面的属性到这里  (注入)
19     private String loginName;  
20     private String password;  
21   
22     @Override  
23     public String execute() { 
24         // 用一个Map做例子  
25         Map<String,String> map = new HashMap<String,String>();  
26         // 为map添加一条数据,记录一下页面传过来loginName  
27         map.put("name",this.loginName);  
28         map.put("pwd",this.password);
29         // 将要返回的map对象进行json处理  
30         JSONObject jo = JSONObject.fromObject(map); 
31 
32         // 调用json对象的toString方法转换为字符串然后赋值给outInfo  
33         this.outinfo = jo.toString();  
34         //测试一下outInfo的结果
35         System.out.println(this.outinfo);  
36   
37         return SUCCESS;  
38     }
39 
40     public String getoutinfo() {
41         return outinfo;
42     }
43     public void setoutinfo(String outinfo) {
44         this.outinfo = outinfo;
45     }
46 
47     public String getLoginName() {
48         return loginName;
49     }
50     public void setLoginName(String loginName) {
51         this.loginName = loginName;
52     }
53 
54     public String getpassword() {
55         return password;
56     }
57     public void setPassword(String password) {
58         this.password = password;
59     }
60 }

web.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     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">
 7   <welcome-file-list>
 8     <welcome-file>index.jsp</welcome-file>
 9   </welcome-file-list>
10   
11   <filter>
12       <filter-name>struts2</filter-name>
13       <filter-class>
14           org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
15       </filter-class>
16   </filter>
17   
18   <filter-mapping>
19       <filter-name>struts2</filter-name>
20       <url-pattern>/*</url-pattern>
21   </filter-mapping>
22 </web-app>

 

 

 

 

 

 

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/11284860.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

关于jQuery Struts2的struts-plugin.xml无效jquery is visible的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Action的实现方式和struts.xml配置的详细解释,Struts2的简单执行过程(二)、com.google.inject.struts2.Struts2GuicePluginModule的实例源码、Java:struts2之struts.xml 配置详解整理........ing、Java基础101 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能等相关知识的信息别忘了在本站进行查找喔。

本文标签: