1、配置web.xml,复制到项目的WebContent/WEB-INF/web.xml文件中就可以了
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<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>
</web-app>
2、配置 lib,将struts核心类库导入WEB-INF\lib中;需要下载struts2的核心类包
3、
3、 jsp文件头的格式(如果用到标签类的话),直接复制吧,直接写容易报错,这点我也很郁闷呀
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
4、配置struts.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
</struts>
5、非必须配置,xxx-validation.xml(验证数据时用的)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="requiredString">
<field-validator type="reequiredstring">
<message> This string is required 必填字段</message>
</field-validator>
</field>
</validators>
6、下载json
http://code.google.com/p/jsonplugin/downloads/list
7、HibernateDaoSupport问题
需下载spring-framework-3.0.5.RELEASE,将dist文件下的org.springframework.orm-3.0.5.RELEASE.jar复制到lib目录下,然在项目中build Path导入此目录下的org.springframework.transaction-3.0.5.RELEASE.jar包
二、注意事项
1、jsp文件中标签s中的action名,要与struts.xml文件中个的action名一致
xx.jsp文件中的语句
<s:form action="submit">
或
<s:form action="submit.action">
struts.xml文件中个语句,注意此时package没有namespace
<package name="action" extends="struts-default">
<action name="submit" class="action.MoreSubmitAction" >
<result name="save">/result.jsp</result>
<result name="print">/result.jsp</result>
</action>
否则报错.
2、jsp访问action类的成员变量值
ActionSupport子类的成员变量
private String message;
jsp中访问数据代码
<s:property value="message"/>
3、jsp访问action类中request对象传递的值
ActionSupport子类
request.setAttribute("result","成功保存["+msg+"]");
jsp中访问数据代码
<h1>${result}</h1>
4、struts.xml中action访问同一jsp页面
<action name="List" class="action.BookAction" method="list">
<result>List.jsp</result>
</action>
<action name="Remove" class="action.BookAction" method="remove">
<result type="redirect">List.action</result>
</action>
5、链接到action中的方法
action中代码
public String remove(){
if(null!=isbn){
dao.removeBook(isbn);
}
else{
dao.removeBooks(isbns);
}
return SUCCESS;
}
struts.xml代码
<action name="Remove" class="action.BookAction" method="remove">
<result type="redirect">List.action</result>
</action>
jsp文件中代码
<a href='<s:url action="Remove"><s:param name="isbn" value="isbn"/></s:url>'>Delete</a>
6、struts2的参数传递问题
set的第一个字母要求是大字的,否则struts2没办法找到,getXXX方法也是一样的道理
jsp文件中代码
<s:param name="id" value="id"/>
action中代码
public String getId() {
return id;
}
public void setId(String id) {
System.out.println("setid");
this.id = id;
}
7、 struts2中form提交到action中的中文参数乱码问题解决办法
jsp页面想action提交中文参数时,容易产生乱码,解决方法
在struts.xml文件中,加入下面一句话,主要这里一般是GBK,其他的编码格式都不对
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
使用json 时,配置是“UTF-8“
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
8、action中使用自定义类的成员变量
自定义person类
public class Person {
private String name;
private String classes;
private String score;
private int id;
action类中
Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
jsp文件中代码
<s:textfield name="person.score"/>
可以将jsp页面的值传入到action
9、jsp遍历数组
自定义book类
public class Book {
private String isbn;
private String title;
private double price;
action中代码,这里的 Collection其实也可以用List代替,这里的books必须先给他赋值
private Collection<Book> books;
public Collection<Book> getBooks() {
return books;
}
public void setBooks(Collection<Book> books) {
this.books = books;
}
//books赋值
public String list(){
books=dao.getBooks();
return SUCCESS;
}
jsp页面代码
<s:iterator value="books">
<tr>
<td><input type="checkbox" name="isbns"
value='<s:property value="isbn"/>' /></td>
<td><s:property value="isbn" /></td>
<td><s:property value="title" /></td>
<td><s:property value="price" /></td>
<td><a
href='<s:url action="Edit"><s:param name="isbn" value="isbn"/></s:url>'>Edit</a>
<a href='<s:url action="Remove"><s:param name="isbn" value="isbn"/></s:url>'>Delete</a>
</td>
</tr>
</s:iterator>
10、”#“主要的三种用途
(1)访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称 | 作用 | 例子 |
parameters | 包含当前HTTP请求参数的Map | #parameters.id作用相当于request.getparameter(“id”); |
request | 包含当前HttpServletRequest的属性(attribute)的map | #request.userName相当于request.getAttribute(“userName”) |
application | 包含当前应用的servletContext属性(attribute)的map | #application.userName相当于application..getAtttibute(“userName”) |
attr | 用于按request>session>application顺序访问其属性(attribute) | #attr.userName相当于顺序在以上三个访问内读取userName属性,直到找到为止 |
(2)用于过滤盒投影(projecting)集合,如books.{?#this.price<100}
(3)构造Map,如#{ 'foo1:'bar1:'foo2':'bar2'}
11、”%“的用途
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,例如在Ognl.jsp中加入以下代码:
<hr/>
<h3>%的用途</h3>
<p><s:url value=”#foobar[‘fool’]”/></p>
<p><s:url value=”%{#foobar[‘fool’]}”/></p>
12、“$”用两个用途
用于在国际化资源文件中,引用OGNL表达式:
在Struts2配置文件中,引用OGNL表达式,如
<action name=”AddPhoto” class=”addPhoto”>
<interceptor-ref name=”fileUploadStack”/>
<result type=”redirect”>ListPhotos.action?albumId=${albumId}</result>
</action>
13、遍历OGNL选择集合
自定义类
public class Student {
private String name;
private int age;
private int score;
public Student(){
action中代码
private List<Student> stus=new ArrayList<Student>();
stus.add(new Student("zxx",23,63));
stus.add(new Student("wangwu",19,60));
stus.add(new Student("zaoli",26,87));
stus.add(new Student("xuke",22,57));
stus.add(new Student("aihua",21,98));
jsp文件中变量选择集合列表
<s:iterator value="stus.{?#this.age>22}">
<li><s:property value="name"/></li>
注:
stus.{?#this.age>22} :返回大于22的所有学生的列表
stus.{^#this.age>22} :返回第一大于22的学生列表
stus.{$#this.age>22} :返回最后一个大于22的学生别列表
<%@ page language="java" import="java.util.*" contentType="text/html; charset=gb2312"
pageEncoding="utf-8"%>
<html>
<head>
<script language="javascript">
function addComponent(){
var uploadHTML=document.createElement ("<input type='file' name='upload'/>");
document.getElementById(" files").appendChild(uploadHTML);
uploadHTML=document.createElement("<p/>");
document.getElementById("files").appendChild(uploadHTML);
}
</script>
</head>
<body>
<input type="button" οnclick="addComponent()" value="添加文件"/>
<br/>
<form οnsubmit="return true;" action="uploadmore.action"
method="post" enctype="multipart/form-data">
<span id="files">
<input type='file' name='upload'/>
<p/>
</span>
<input type="submit" value="上传"/>
</form>
</body>
</html>
三、报错
1、java.io.FileNotFoundException: Template /template/simle/form.ftl not found.
这是当前访问的jsp文件中拼写错误
<s:form action="Remove" theme="simle">
正解:
<s:form action="Remove" theme="simple">
2、Could not create and/or set value back on to object
3、Unable to find ‘struts.multipart.saveDir’ Struts2上传文件错误的解决方法
、4、在使用struts2的项目中上传文件的时候出现了一个这样的错误:
2011-7-30 20:29:02 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
2011-7-30 20:29:02 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Removing file upload F:\software_programming\project\source code\.metadata\.plugins\org
原因是没有设置存放临时文件的文件夹,而错误提示中的struts.multipart.saveDir就是设置临时文件夹的属性,把该配置写到struts.properties文件中即可,如下:
struts.multipart.saveDir = /tmp如果此文件夹不存在,Struts 2会自动创建一个。
也可以在struts.xml配置文件中添加一个常量设置:
<constant name="struts.multipart.saveDir" value="/tmp"></constant>