现在的位置: 首页 > 综合 > 正文

验证Struts2需要的包,并产生疑问,请帮忙解答,谢谢!

2013年12月11日 ⁄ 综合 ⁄ 共 5986字 ⁄ 字号 评论关闭

本来是为了验证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:

发现文章有错的请通知我,非常感谢!

来过的朋友请顺便踩一脚......^_^

抱歉!评论已关闭.