我的环境
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上一样能看到。
遇到的问题
关于缺少指定包的报错,这里就不提了,认真查看报错内容,把缺少的包加进来就好。
-
配置web.xml(项目》WebContent》WEB-INF》lib》web.xml)
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>config</param-name> <param-value>struts-default.xml,struts-plugin.xml,/struts.xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
配置struts.xml(struts.xml名字是固定的,应该在项目》Java Resources》src》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> <include file="struts-default.xml"></include> <!-- 指定默认编码集 --> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- 指定需要Struts2处理的请求后缀 --> <constant name="struts.action.extension" value="do,action"></constant> <!-- 设置浏览器是否缓存静态内容,开发阶段应关闭,生产阶段打开,默认为打开 --> <constant name="struts.serve.static.browserCache" value="false"></constant> <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认为false,开发阶段应打开 --> <constant name="struts.configuration.xml.reload" value="true"></constant> <!-- 开发模式下使用,可以打印出更详细的错误信息 --> <constant name="struts.devMode" value="true"></constant> <!-- action全部用注解进行配置 --> <!-- 是否开启动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!--添加包 --> <!-- <package name="tutorial" extends="struts-default"> <action name="p" class="JavaSource.AllPersonAction" method="show"> <result name="all" >all.jsp</result> <result name="error">error.jsp</result> </action> <action name="testAction" class="com.app.action.TestAction" method="test"> <result name="all" >all.jsp</result> <result name="error">error.jsp</result> </action> </package> --> </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方法就顺利执行了,并跳转到了相应的界面。不管怎样,问题还是解决了。
我这里就直接粘贴自己的代码了。
import org.apache.struts2.convention.annotation.*;
import com.opensymphony.xwork2.ActionSupport;
@ParentPackage("struts-default")
@Results({@Result(name="all",location="all.jsp"),@Result(name="error",location="error.jsp")} )
public class TestAction extends ActionSupport {
@Action(value="test")
public String test(){
return "all";
}
}
说明:引入的包,上面提到的convention就是用来注解的。其实和struts.xml中package标签的内容是一致的。@Results只能写一个,但其中可以包含多个@Result,每个@Result必须写name和location,因为从下面被@Action标注的方法被调用之后,就会根据其返回的String和@Result的name属性进行比对,相同的话就将页面转到location属性指定的内容上,跳转的方式也是一个属性,这里没写就是默认的。注意@Results里的书写形式,不要忘记大括号,逗号。
4.struts标签库
struts标签库在jsp文件中引用:
<%@ 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,书写方法时可以覆盖原方法,也可以创建自己的方法。方法的声明都要写成
public String test(){
//代码块
return "success";//success只是默认的一个name
}
6.获取request,session,response
在action中,要想获取这些对象,需要借助ServletActionContext来获取。
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("list", list);
本文有任何错误还请指出,O(∩_∩)O谢谢。