struts 2环境的配置:
把struts.xml文件拷贝到项目的src目录下:
STRUTS_HOME/apps/struts2-blank-2.1.6/WEB-INF/src/java/struts.xml
把相关jar文件拷贝到项目中:
STRUTS_HOME /apps/struts2-blank-2.1.6/WEB-INF/lib 目录下的相关jar文件
配置web.xml文件:
可以从
STRUTS_HOME /apps/struts2-blank-2.1.6/WEB-INF/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>
实现最简单的的struts文件配置:
<!—配置struts常量,设置为开发模式-->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="hell">
<result>
/Hello.jsp
</result>
</action>
</package>
设置struts标签的自动提示功能:
在MyEclipse Enterprise Workbench-->Files and Editors-->XML-->XML Catalog-->Add...添加文档,选择
\STRUTS_HOME\struts-2.1.6\lib\struts2-core-2.1.6\struts-2.0.dtd 文件,Key Type选择URI,Key上填写:
http://struts.apache.org/dtds/struts-2.0.dtd"
Namespace 命名空间:
<package name="front" extends="struts-default" namespace="/front">
如果namespace不写,则相当于:namespace=””;
Action:
三种创建方法:
public class IndexAction1 {
public String execute() {
return "success";
}
}
//只要有execute方法,返回了字符串,就可以被strut2认为是action
public class IndexAction2 implements Action {
@Override
public String execute() {
return "success";
}
}
public class IndexAction3 extends ActionSupport {
@Override
public String execute() {
return "success";
}
}
//一般使用第三种方法,
struts配置文件:
<action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
<result name="success">/ActionIntroduction.jsp</result>
</action>
Path路径问题:
JSP中的“/”代表的是服务器的跟路径,而不是网站的根路径,struts中不允许出现“//”两个斜杠,一般使用绝对路径:
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
<base href="<%=basePath%>" />
ActionMethod_DMI动态方法:
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
可以使用method属性显式调用add方法;
也可以在url地址中动态指定执行的方法(action名!方法名):
.../user!add
推荐使用动态指定的方式
ActionMethod_通配符配置:
使用通配符,将配置量降到最低,不过一定要遵守“约定优于配置”的原则。
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
访问方法:
<a href="<%=context %>/actions/Studentadd">添加学生</a>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
访问方法:
<a href="<%=context %>/actions/Teacher_add">添加老师</a>
注意:如果在同一个package中,有一个请求符合两个action的配置,会默认匹配第一个。
用Action的属性接收参数:
URL访问:.../user/user!add?name=a&age=1
要在action中获取参数,需要添加两个属性,并加上getter和setter方法:
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
用DomainModel接收参数:
URL访问:.../user/user!add?user.name=a&user.age=1
private User user;
//private UserDTO userDTO;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
用ModelDriven接收参数:
实现ModelDriven接口
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User>{
//重新方法
@Override
public User getModel() {
return user;
}
ModelDriven自动调用getModel()方法获取user对象
比较常用的是用DomainModel接收参数
2.1.6版本的中文问题:
<constant name="struts.i18n.encoding" value="GBK" />
在struts.xml文件中配置上面国际化属性为GBK使之支持中文
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
解决不了乱码问题,应该使用下面的filter: <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
简单数据验证:
Action:
public String add() {
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");
return ERROR;
}
return SUCCESS;
}
JSP:
使用struts的标签库:
<%@taglib uri="/struts-tags" prefix="s" %>
<s:fielderror fieldName="name" theme="simple"/>
<br />
<s:property value="errors.name[0]"/>
<s:debug></s:debug>
访问Web元素:
在Action中取得request的方法:
Map类型:
Action:
private Map request;
private Map session;
private Map application;
//可以在构造方法中取值
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
JSP:(两种访问方法)
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
原始类型:
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public LoginAction3() {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}
JSP:
<s:property value="#attr.a1"/><br />
<s:property value="#attr.s1"/><br />
<s:property value="#attr.r1"/><br />
模块包含:
<include file="login.xml" />
默认Action:
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
结果类型_result_type:
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
//dispatcher服务器跳转到页面中取
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
//重定向到页面中
<action name="r3">
<result type="chain">r1</result>
</action>
//forward到另外一个action
<action name="r4">
<result type="redirectAction">r2</result>
</action>
重定向到另外一个action
Global_Results_全局结果集:
<package name="user" namespace="/user" extends="struts-default">
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
...
</package>
<package name="admin" namespace="/admin" extends="user">
<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
<result>/admin.jsp</result>
</action>
</package>
动态结果集_dynamic_result:
Action:
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
struts.xml:
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
<!--${},OGNL表达式,表示从值栈中取值-->
带参数的结果集:
Action:
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
struts.xml:
<result type="redirect">/user_success.jsp?t=${type}</result>
JSP:
在URL中指定type的值:
<a href="user/user?type=1">传参数</a>
OGNL表达式:
<li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
//如果user是struts创建,需要保存空的构造方法;
<li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr />
//访问静态方法需要配置一下常量:
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
//{}在ognl代表一个集合
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
// dogs[1]取不出来,因为set元素没有顺序
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<hr />
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
//?代表选择符合条件的所有元素
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
//^代表这些元素中的第一个
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
//^代表这些元素中的最后一个
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
<hr />
<li>[]:<s:property value="[0].username"/></li>
//[]表示访问值栈中相对应位置的对象,[0]表示栈顶元素,一般为最近访问的Action
联系客服