本来是为了验证Struts2需要什么Jar包做的测试,没想到出个那么奇怪的问题。
添加一个空Web Project
部署...运行....正常!
添加struts2-core-2.1.8.1.jar到项目WEB-INF/lib
添加struts.xml到src下
添加struts配置到web.xml里面
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
重新部署...运行....出错!(出错才是正常的!^_^)
运行——
错误信息非常明确!
严重: Exception starting filter struts2
java.lang.NoClassDefFoundError: com/opensymphony/xwork2/ActionContext
解决——缺少xwork2,所以xwork2是必须的!添加xwork-core-2.1.6.jar到WEB-INF/lib里面
重新部署,运行!
运行——
2010-3-3 0:44:56 com.opensymphony.xwork2.util.logging.jdk.JdkLogger error
严重: Dispatcher initialization failed
Unable to load configuration. - bean - jar:file:/D:/Tomcat6.0/webapps/LukeBlog/WEB-INF/lib/struts2-core-2.1.8.1.jar!/struts-default.xml:47:178
......
Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.RequestContext
......
解决——
没有找到类,是fileupload下的,也就是说struts-default.xml里面某个configuration用到了fileupload包下面的类
引入commons-fileupload-1.2.1.jar到WEB-INF/lib
顺便先看看struts-default.xml的47行做了些啥
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default"/>
没看出究竟来
运行——
2010-3-3 0:59:46 com.opensymphony.xwork2.util.logging.jdk.JdkLogger error
严重: Dispatcher initialization failed
Unable to load configuration. - bean - jar:file:/D:/Tomcat6.0/webapps/TestStruts/WEB-INF/lib/struts2-core-2.1.8.1.jar!/struts-default.xml:53:89
......
Caused by: java.lang.ClassNotFoundException: freemarker.template.SimpleHash
......
解决——缺少freemarker下面的东西,继续搬运,将freemarker-2.3.15.jar引入WEB-INF/lib
重部署...运行...
运行成功!!!
也就是说要Struts2项目运行成功,最起码先得有
struts2-core-2.1.8.1.jar——核心包
——>依赖:xwork-core-2.1.6.jar——xwork原来是webwork2的基础东西,后来独立抽取出来放struts2里面了
——>依赖:commons-fileupload-1.2.1.jar——commons的文件上传包
——>依赖:freemarker-2.3.15.jar——模板引擎,一个基于模板生成文本输出的通用工具
但是网上很多资料说还要用到
commons-logging.jar和ognl-2.6.11.jar
这是为什么呢?
Web Project本身引入到的JDK1.6和JavaEE5的Lib里面并没有上述这两个包。
为了更正确一点,加个Action和JSP测试跳转
testAction.java
public class testAction {
public String visitPage(){
return "success";
}
}
testStruts.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
Just Test Page!
</body>
</html>
修改index.jsp
<body>
<form action="visit.action" method="post">
This is my JSP page.
<br>
<button type="submit">
Forward to testStruts
</button>
</form>
</body>
修改struts.xml
<struts>
<package name="testStruts2" extends="struts-default">
<action name="visit" class="com.testStruts.actions.testAction" method="visitPage">
<result name="success">/WEB-INF/web/page/testStruts.jsp</result>
</action>
</package>
</struts>
部署...运行....
index.jsp正常!点击按钮,跳转页面也正常!
那这commons-logging.jar和ognl-2.6.11.jar到底是为啥算是必须呢?
当然ognl是好用的,干脆就不加包试试使用ognl
修改testAction.java
/**
*
*/
package com.TestStruts.actions;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
/**
* @author Luke
*
*/
public class testAction {
//接收页面用户名和密码两个参数
String username;
String password;
//私有内部类Book和其引用,准备测试ognl
private class Book{
public String bookID;
public String bookName;
public String author;
public int price;
public Book(String bookid,String bookname,String author,int price){
bookID = bookid;
bookName = bookname;
author = author;
price = price;
}
}
private List<Book> books;
//接受访问并跳转页面
public String visitPage(){
//内部打印看看
System.out.println(username);
System.out.println(password);
//将参数设置到Application和Session,准备测试ognl
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("msg", "Application信息");
ctx.getSession().put("msg", "Session信息");
//将参数设置到request,准备测试ognl
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("username", username);
request.setAttribute("password", password);
//填充books对象
books = new ArrayList();
books.add(new Book("A-123","Struts in Action","AAA",70));
books.add(new Book("B-456","Spring in Action","BBB",68));
books.add(new Book("C-789","JPA in Action","CCC",40));
return "success";
}
//set And get
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
修改testStruts.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
Just Test Page!
<!-- 测试ognl参数获取 -->
<p>parameters:<s:property value="#parameters.username[0]" /></p>
<p>parameters:<s:property value="#parameters.password[0]" /></p>
<p>attr.msg: <s:property value="#attr.msg" /></p>
<br>
<p>session.msg: <s:property value="#session.msg" /></p>
<p>application.msg: <s:property value="#application.msg" /></p>
<br>
<p>request.username: <s:property value="#request.username" /></p>
<p>request.password: <s:property value="#request.password" /></p>
<br>
<!-- 测试ognl数组获取 -->
<ul>
<s:iterator value="books">
<li>
<s:property value="bookID"/>
<s:property value="bookName"/>
<s:property value="author"/>
<s:property value="price"/>
</li>
</s:iterator>
</ul>
<br><br>
<!-- 测试ognl Maps获取 -->
<s:set name="boyandgirl" value="#{'boy1':'girlA', 'boy2':'girlB'}" />
<p>这是boy2的girl:<s:property value="#foobar['boy2']" /></p>
</body>
</html>
重新部署,编译,运行.....
index.jsp正常!
用户名:1234,密码:5678,点击按钮....
testStruts.jsp出乎我意料的正常运行了!!!???
而且部分数据还是正常的!!!
除了“books”(数组)和“boyandgirl”(Maps),上面的数据都能获取,网上很多教程不是说“#”是ognl的功能符号么?
不敢相信,于是去Tomcat的webapps下面去检查项目的lib,确实没有ognl的包存在。
只是多了jsf-api.jar-impl.jar、jsf、jstl.jar这三个从JavaEE5 Lib引用过来的包
疑惑,不解....有哪位大侠能给个解答呢???
惯例PS:
发现文章有错的请通知我,非常感谢!
来过的朋友请顺便踩一脚......^_^