1、使用2.3.34的版本,2.1.6存在中文乱码的问题,下面是pom表单的模板
2、解决乱码要注意的问题:
(1)记得表单提交尽量用post方法
(2)编码全部用utf-8,包括jsp页面与编码页面都要设置好
(3)struts的配置文件要写好。
3、开发流程,以开发一个helloworld为例
(1)pom.xml配置,引入struts,一个模板
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.34</version>
</dependency>
(2)配置web.xml文件,一个模板
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter> <!--定义核心Filter FilterDispatcher -->
<filter-name>struts2</filter-name> <!-- 定义核心Filter的名称 -->
<filter-class> <!--定义核心Filter的实现类 -->
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name><!--核心Filter的名称 -->
<url-pattern>/*</url-pattern><!--使用该核心Filter过滤所有的Web请求 -->
</filter-mapping>
</web-app>
(3)写一个只有name和sex两个属性的user类,类似文件一般放在po包里
public class user {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
(4)写一个用户页面,向后台提交user的name属性
<form action="hello.action" method="post">
<label for="name">Please enter your name</label><br/>
<input type="text" name="name"/>
<input type="submit" value="Say Hello"/>
</form>
(5)配置struts.xml文件,指明action的名字,由哪个类处理,结果应该怎么处理
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<package name="struts2" extends="struts-default">
<action name="hello" class="com.wyj.action.HelloWorldAction">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
(6)写对应的action类,一般封在action包中
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.wyj.po.user;
public class HelloWorldAction extends ActionSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute() throws Exception {
user u=new user();
u.setName("我们");
ServletActionContext.getRequest().setAttribute("uu", u);
System.out.println(name);
return "success";
}
}
(7)对于ServletActionContext.getRequest().setAttribute("uu", u);这种样式的,相应的jsp页面要用<s:property value="#request.uu.sex" />或者<s:property value="#request.uu.getSex()" />(当然了,po里要有这个方法)来接收,如果单独对于一个name来说,用<s:property value="%{name}" default="未接收到"/> 来接收就好了,但是这种要有set,get方法,而且action里的属性名要与页面传回来的名字一致,set,get方法名的后半部要与属性名第一个字母大写以后相同。
(8)Action中get,set方法的使用流程?
前台form中有一个<input type="text" name="username"/>
如果传到action。在action中应该有一个属性,名字也叫username;而且这个username有get/set方法,其中get方法的命名必须为getUsername,其中set方法的命名必须为setUsername。
当struts接受这个action请求时,struts调用 username的get方法把前台的值传到action中的username,当action处理完成,要返回到页面时。在生成jsp的过程中,你可以在页面中使用EL,${username},这时调用username的set方法。
(9)怎么传一个对象到jsp
user u=new user();
u.setName("wyj");
u.setSex("male");
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("user",u);
前台用 <s:property value="#request.user.name" />接收
(10)传一个集合到jsp,迭代取值
后台:
List<Subject> subjects = subjectService.findAllSubject();
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("subjects", subjects);
前台:
<tr>
<td><s:property value="#subject.subjectID"/></td>
<td><s:property value="#subject.subjectTitle"/></td>
<td><s:property value="#subject.subjectAnswer"/></td>
<td><a href="subjectParticular.action?subjectID=<s:property value="#subject.subjectID"/>">查看</a></td>
<td><a href="subjectUpadateBefore.action?subjectID=${subject.subjectID}">更新</a></td>
<td><a href="subjectDelete?subjectID=${subject.subjectID}">删除</a></td>
</tr>
</s:iterator>
4、关于标签问题,EL标签不能与struts tag混用了。起码不能内部混用,像<s:if test="${item.flag} ==0 ">这种是不能使用的。
!!一个大坑,<s:if test="#request.uu.name==\"wyj\"">鬼鬼鬼</s:if>这里,如果wyj没有加引号死活出不来值,可能加引号才是字符串吧。下边这些测试有用。
!!jsp接不到Action传来的值
如果type这样写会导致无法接收,action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。Struts2的标签使用方法:
#使用的时候,在jsp头部加入:<%@ taglib prefix="s" uri="/struts-tags"%>
#1.<s:textfield />的用法
这个尾端要打斜杠,为它赋初值用<s:textfield value="%{#request.uu.name}" />或者<s:textfield value="%{name}" />