struts2是java web开发的MVC开发框架,struts2不同的版本,开发的包有一些变化,这也导致了网上许多入门教程照做最后都运行不起来,最常报的错误就是404错误,这里有必要自己记录一下。
开发环境
1、STS 3.7.3(Spring Tool Suit),下载。STS其实是一个包装过的Eclipse,由Spring小组开发的,专门用于Spring项目的开发,当然也可以集成struts2进来,如果你使用的是Eclipse或者MyEclipse也行。老规矩,安装之前先要安装jdk,并配置好环境变量。
2、Tomcat 7,下载Tomcat 7。sts已经集成了一个叫Pivotal tc Server的web服务器,不过我们一般都使用Tomcat作为我们的Web服务器。Tomcat配置。
创建项目
6、导入strust2包
struts2包下载下来后,手动复制粘贴到项目所在位置的WEB-INF/lib,然后右键刷新项目,就可以看到包导入进来了,不仅在lib下可以看到,它也自动导入到了Web App Libarary下,如图所示:
7、配置web.xml
我们接下来需要在web.xml中配置struts2的核心控制器FilterDispacher,这个控制器主要是拦截请求,并将请求映射到具体的某个可以处理该请求的Action。不同的struts2版本中,FilterDispacher的叫法不一样,在struts-2.5.2中叫org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter。web.xml配置核心控制器内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!-- Struts2配置 -->
<filter>
<!-- 配置核心过滤器 -->
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<!-- 拦截所有请求 -->
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
在web.xml中配置好核心过滤器后,struts2就可以正式开始工作了。
8、编写HelloWorld.jsp页面
在webcontent下面新建HelloWorld.jsp页面,内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2><s:property value="message" /></h2>
</body>
</html>
9、编写Action类
与Spring MVC不同的是,在struts2中,处理请求的是对象,而不是方法。在src目录下新建package取名main,然后创建类HelloWorldAction.java,如图所示:
HelloWorldAction.java内容如下:
package main;
import com.opensymphony.xwork2.Action;
public class HelloWorldAction implements Action
{
public final static String MESSAGE = "Hello World!This my first struts2 project!";
private String message;
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}
/*
* 实现Action接口中的execute方法,在该方法中处理请求
* */
public String execute() throws Exception
{
setMessage(MESSAGE);
return SUCCESS;
}
}
处理请求的类必须实现Action接口或者继承ActionSupport类(其实ActionSupport也是实现了Action接口),然后在execute方法中处理请求,然后返回结果字符串即可。这里的SUCCESS是在Action接口中预定好定义的结果字符串“success”。
10、请求-Action映射
刚才说了核心控制器会根据请求来寻找能够处理该请求的Action类,这些映射都被写入了struts.xml的配置文件中。到时候org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter就会从struts.xml中读取映射。
在src目录中新建struts.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.3.dtd">
<struts>
<package name="struts2" extends="struts-default">
<!-- 请求-Action映射 -->
<action name="HelloWorld" class="main.HelloWorldAction">
<!-- 返回结果 -->
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
在上面的映射中处理HelloWorld请求的类为main.HelloWorldAction类,返回的结果为success则映射到了HelloWorld.jsp页面。
11、运行
右键项目Run As--->Run On Server,在地址栏中输入http://localhost:8080/StrutsHelloWorld/HelloWorld,如下图所示:
至此一个简单了struts2 Hello World便完成了,如果你成功看到了Hello World,而不是404,那么恭喜你!
工程下载:struts2 Hello World工程源码。
常见错误及解决方案:
1、最常见的错误要属404错误了,相信很多人都被这个错误折磨了很久,如图所示:
debug模式下console的输出为:
意思就是找不到类 ,引起这个错误的原因有很多,最常见的是包不全、build path和类名拼写错误这三个原因。
(1)、包不全的问题,直接下载我给出的最小必备包就可以了。我之前就是栽在这个问题上的,官网给出的无论是最小包还是完整包,都不完整,都差别的包,不知道为什么会出现这样的低级错误。而且更无语的是,你包多了也不行,也会报错。为了大家少折腾,我给出了最小必备包,直接下载下来用就行了。
(2)、如果是build path的问题,那么请将包放在WEB-INF/lib下面,不要通过User Library导入,如图所示:
如果放入后不能识别这些包,那是因为你没有在Library中加入Web App Library,WEB-INF/lib下的包最后会自动被拷贝至Web App Library,没有Web App Library的话当然不能识别。右键项目--->build path---->Configure Build Path,然后选择Add Library,如图所示:
选择Web App Library,一路next,然后finish即可。
这样就OK了。
如果你说:“手动拷贝到WEB-INF/lib下面,太麻烦了,我就想用User Library的方式导入!”别急,我们也有办法,通过User Library的方式导入后(这个不用我教吧?),右键项目--->build path---->Configure Build Path,然后选择Deployment Assembly,点击Add,如图所示:
选择Java Build Path Entries,如图所示:
选择你自己建立的struts2的User Library包,然后点击finish,然后点击OK就行了。
(3)、拼写错误
这个错误最坑爹,如果你是照着书本或者网上教程来的,很有可能核心控制器FilterDispacher的名字各不一样,有的人是org.apache.struts2.dispatcher.FilterDispatcher,这个是老版本的写法,也有的人是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,但是我告诉你struts2.5.2里的写法是:org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter。请仔细检查你的FilterDispacher的拼写错误,比如大小写,名字与版本对应。如果你不知道你的版本的FilterDispacher的名字叫什么,请在左侧Project Exploer中打开struts2-core-2.5.2.jar,找到org.apache.struts2.dispatcher.filter包,查看你的FilterDispatcher的名字,如图所示:
(4)、Tomcat
报404错误还有一部分原因是tomcat引起的,为了保证顺利运行,请安装Tomcat时,路径中不要带有空格。如果上面三个错误都解决后,仍然报404错误,请在你的IDE的servers中删除tomcat并重新配置后再运行,如图所示:
2、Tomcat报错:A child container failed during start。
原因是包不完整,缺少log4j-api-2.6.2.jar和log4j-core-2.6.2.jar两个包。网上说还有可能是web.xml配置错误,url-pattern缺少/,正确的如下所示:
<filter-mapping>
<!-- 拦截所有请求 -->
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、报错:java.lang.ClassNotFoundException: javassist.ClassPool
原因是包不完整,缺少javassist-3.20.0-GA.jar包,添加进来即可。
4、报错:java.lang.NoSuchMethodError: org.apache.logging.log4j.status.StatusLogger.debug
这个是因为我在包中加入 log4j-api-2.6.2.jar和log4j-core-2.6.2.jar两个包,而完整包里已经包含了log4j-api-2.5.jar,删除log4j-api-2.5.jar即可。
5、报错:unable to load configuration -bean...Caused by: java.lang.ClassNotFoundException: org.apache.struts2.views.gxp.inject.InjectedObjectContainer
原因是包太多(坑爹有木有),删除不必要的包,只保留必需的。然后在servers中删除并重新配置tomcat,防止包没有删除干净。