分享

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

 日月桃子 2017-03-14

    我的环境

        Eclipse JavaEE |1.8JDK |Tomcat8.0| 动态web项目3.1| struts2.5.2

    struts相关包

        我使用的是struts2.5.2版本,是目前的最新版本。需要的核心包如下:


        其实包是看你自己需要,比如struts2-convention-plugin-2.5.2.jar包是用来使用注解的,如果不使用注解(即@result@action等等),就没必要加这个包。有人用Spring,那也要加载它相关的包。

    struts包下载

        我用的是全资源的包,所以能看源码,如果不需要,可以只下载核心包。


        全资源的包解压缩后有四个文件夹,apps是war files的示例包;docs是各种html文件,算是解释文档;lib是所有的jar资源,但里面没有xwork-core这个jar;src是所有struts文件的源码,如果确实有需要,可以看看。当然,这些在github上一样能看到。

    遇到的问题

        关于缺少指定包的报错,这里就不提了,认真查看报错内容,把缺少的包加进来就好。

  1. 配置web.xml(项目》WebContent》WEB-INF》lib》web.xml)
    1.        <filter>  
    2.     <filter-name>struts2</filter-name>  
    3.     <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>  
    4.     <init-param>  
    5.         <param-name>config</param-name>  
    6.         <param-value>struts-default.xml,struts-plugin.xml,/struts.xml</param-value>  
    7.     </init-param>  
    8. </filter>  
    9. <filter-mapping>  
    10.     <filter-name>struts2</filter-name>  
    11.     <url-pattern>/*</url-pattern>  
    12. </filter-mapping>  

  2. 配置struts.xml(struts.xml名字是固定的,应该在项目》Java Resources》src》struts.xml, 需要你自己创建)

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE struts PUBLIC  
    3.             "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    4.     "http://struts./dtds/struts-2.5.dtd">  
    5. <struts>  
    6.     <include file="struts-default.xml"></include>  
    7.     <!-- 指定默认编码集 -->  
    8.     <constant name="struts.i18n.encoding" value="UTF-8"></constant>  
    9.     <!-- 指定需要Struts2处理的请求后缀 -->  
    10.     <constant name="struts.action.extension" value="do,action"></constant>  
    11.     <!-- 设置浏览器是否缓存静态内容,开发阶段应关闭,生产阶段打开,默认为打开 -->  
    12.     <constant name="struts.serve.static.browserCache" value="false"></constant>  
    13.     <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认为false,开发阶段应打开 -->  
    14.     <constant name="struts.configuration.xml.reload" value="true"></constant>  
    15.     <!-- 开发模式下使用,可以打印出更详细的错误信息 -->  
    16.     <constant name="struts.devMode" value="true"></constant>  
    17.     <!-- action全部用注解进行配置 -->  
    18.   
    19.     <!-- 是否开启动态方法调用 -->  
    20.     <constant name="struts.enable.DynamicMethodInvocation" value="false" />  
    21.     <!--添加包 -->  
    22.     <!-- <package name="tutorial" extends="struts-default"> <action name="p"   
    23.         class="JavaSource.AllPersonAction" method="show"> <result name="all" >all.jsp</result>   
    24.         <result name="error">error.jsp</result> </action> <action name="testAction"   
    25.         class="com.app.action.TestAction" method="test"> <result name="all" >all.jsp</result>   
    26.         <result name="error">error.jsp</result> </action> </package> -->  
    27. </struts>  

    说明:第三行和第四行有字样struts2.5,如果是2.0的版本就应该写成2.0。

                 第六行struts标签中的include标签代表引进了struts-default.xml,如果你需要配置很多action又觉得放在struts.xml里显得冗杂时,可以用这种方式引用其他struts的配置文件。

                 倒数第六行被我加了注释,因为我使用的是注解,所以不需要在此配置action,如果你们要配置,可以按照我的这个来写,这不是一个包含所有属性的语句,详细的还需要自己去查。

                 package标签里放置的是一组相关的action,name属性可以修改,就是一个标识作用,extends建议不要修改,另外还有一个namespace属性,默认是“/”,比如改成“/test”,那请求package标签内的action时必须写成/test/XXX.action才能读到这个action。

                 action标签的name就代表请求的.action的名字,实际指定的是class代表的java文件,书写格式“类名.包名”;method制定了调用的方法,要和请求的方法名相同。方法是要写成public String 方法名(){//代码块;return "success";}一旦这个action执行完之后,就会走action标签里的result,当return 后面的String与result标签的name相同时,就会执行这个result标签里包含的内容,这里是.jsp文件,那也可以继续指定执行其他action文件。       

    3.注解

        说到注解,让我又爱又恨,我第一次用它,报404,网页从未找到.action文件,后来创建了一个testaction,里面写了一个test方法,复制了一模一样的注解过来,结果这个test方法就顺利执行了,并跳转到了相应的界面。不管怎样,问题还是解决了。

        我这里就直接粘贴自己的代码了。

  1. import org.apache.struts2.convention.annotation.*;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. @ParentPackage("struts-default")    
  5. @Results({@Result(name="all",location="all.jsp"),@Result(name="error",location="error.jsp")} )  
  6. public class TestAction extends ActionSupport {  
  7.     @Action(value="test")  
  8.     public  String test(){  
  9.           
  10.         return "all";  
  11.     }  
  12.       
  13. }  
        说明:引入的包,上面提到的convention就是用来注解的。其实和struts.xml中package标签的内容是一致的。@Results只能写一个,但其中可以包含多个@Result,每个@Result必须写name和location,因为从下面被@Action标注的方法被调用之后,就会根据其返回的String和@Result的name属性进行比对,相同的话就将页面转到location属性指定的内容上,跳转的方式也是一个属性,这里没写就是默认的。注意@Results里的书写形式,不要忘记大括号,逗号。

        4.struts标签库

        struts标签库在jsp文件中引用:

  1. <%@ taglib uri="/struts-tags" prefix="s" %>    
       我刚才就经历了uri的报错,uri下标注了红线,下文中所有的s标签都被警告,真是震惊到我了。因为之前一直好好的,我没改动过任何包和配置,也没改动这个jsp文件,竟然报错了。问题后来解决了,是jar包有问题。因为Tomcat重新启动的时候报一个LifeStyleClass的错(貌似这个错叫这个名字),eclipse提示无法读取jar包,我在项目里一个一个双击打开jar包,直到双击struts2-core-2.5.2.jar时提示该包损坏,我置换成新包之后就不报错了。

        s标签很好用,我用它遍历action生成的list,在页面里输出了一个表格。看apps里的rest-showcase示例,它的jsp文件里用到了s标签。它的java文件用到了注解,很小的一个案例,可以看看。

         5.Aciton文件创建

        务必继承AcitonSupport,只有这样struts才支持这个action,书写方法时可以覆盖原方法,也可以创建自己的方法。方法的声明都要写成

  1. public String test(){  
  2.     //代码块  
  3.     return "success";//success只是默认的一个name  
  4. }  

       6.获取request,session,response

        在action中,要想获取这些对象,需要借助ServletActionContext来获取。

  1. HttpServletRequest request = ServletActionContext.getRequest();  
  2. request.setAttribute("list", list);  
原文地址:http://blog.csdn.net/en_reading/article/details/52467548



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多