Action
1.在struts.xml中加入<constant name="struts.devMode" value="true" />
value设置成true,应用struts开发模式,每次修改struts.xml就不用重启服务器了。
2.查看struts的源码。
Referenced Librariesàstruts2-core-2.3.15.jar右键—>Propertiesàjava source attachmentà点External Folderà路径选:文件夹目录/struts-2.3.15/src/core/src/main/java
3.在myeclipse附加上struts的javadoc
Referenced Librariesàstruts2-core-2.3.15.jar右键—>PropertiesàJavadoc Locationà路径选:文件夹目录/ struts-2.3.15/docs/struts2-core/apidocs
4.namespace命名空间
namespace决定了action的访问路径,默认为"",可以接收所有路径的action
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,/xxx/index.action,或者/xxx/yyy/index.action.
namespace最好也用模块来进行命名
5.新引入项目的时候,解决jre system library不匹配的问题
jre system library右键—》build path—》remove from build path。项目名右键—》build path—》configure build path—》选library标签—》add library—》选jre system library—》finish
6.Action
具体视图的返回可以由用户自己定义的Action来决定
具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容
具体Action的实现可以是一个普通的java类,里面有public String execute方法即可
或者实现Action接口
不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法
Srtucts.xml中的配置:
<package name="front" extends="struts-default" namespace="/">
<action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
<result name="success">/ActionIntroduction.jsp</result>
</action>
</package>
7.path路径问题
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。(少用)
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath。
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href=”<%=basePath%>”/>
8.ActionMethod调用
Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
<a href="<%=context %>/user/userAdd">添加用户
<a href="<%=context %>/user/user!add">添加用户(推荐)
前者会产生太多的action,所以不推荐使用
public class UserAction extends ActionSupport {
public String add() {
return SUCCESS;
}
}
9.通配符设置
使用通配符将配置量降到最低。不过,一定要遵循“约定优于配置”的原则。
Index.jsp:
<a href="<%=context %>/actions/Teacher_add">添加老师</a>
<a href="<%=context %>/actions/Teacher_delete">删除老师</a>
Struts.xml:
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
</action>
TeacherAction.java:
public String add() {
return SUCCESS;
}
public String delete() {
return SUCCESS;
}
10.Action接受参数三种方法:
(1)使用Action属性接收参数:
<a href=”user/user!add?name=xiao”>添加用户
UserAction.java:
public class UserAction extends ActionSupport {
private String name;
public String add() {
System.out.println("name=" + name);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java类必须包含get和set方法,struts会自动帮助填充。
(2)Domain Model方法
使用Domain Model接收参数<a href="user/user!add?user.name=a&user.age=8">添加用户</a>
User.java
package com.bjsxt.struts2.user.model;
public class User {
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;
}
}
UserAction.java
public class UserAction extends ActionSupport {
private User user;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
(3)Model Driven(不常用)
使用Model Driven接收参数<a href="user/user!add?user.name=a&user.age=8">添加用户</a>
UserAction.java
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
11.struts2的中文问题
Struts.xml中加入<constant name="struts.i18n.encoding" value="GBK" /> <!-- i 18n=internationalization -->
在web.xml中把
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
换成 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
12.简单的数据校验
Struts.xml:
<package name="user" extends="struts-default" namespace="/user">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
<result name="error">/user_add_error.jsp</result>
</action>
</package>
UserAction.java
public class UserAction extends ActionSupport {
private String name;
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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
User_add_error.jsp:
<%@taglib uri="/struts-tags" prefix="s" %>
<s:fielderror fieldName="name" theme="simple"/>(有自动的格式,不太好用。)
<br />
<s:property value="errors.name[0]"/>(常用,取出值栈的值)
<s:debug></s:debug>
13.struts2访问Web元素
IoC:Inversion of Control控制反转
<form name="f" action="" method="post">
用户名:<input type="text" name="name"/>
密码:<input type="text" name="password"/>
<br />
<input type="button" value="submit2" οnclick="javascript:document.f.action='login/login2';
document.f.submit();" />
</form>
LoginAction.java:
*继承SessionAware接口
*重写public void setSession(Map<String, Object> session) ;方法
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
//DI dependency injection
//IoC inverse of control
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
14.struts2模块包含
Struts.xml:
<struts>
<constant name="struts.devMode" value="true" />
<include file="login.xml" />
</struts>
Login.xml:书写方式和struts.xml一样,只是为了分模块开发方便。
15.默认Action
敲不存在的地址或者错误地址,默认跳转到name=index的网页。
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
results
16.Results类型
<li><a href="r/r1">dispatcher</a></li>(默认)服务器跳转,地址栏不变
<li><a href="r/r2">redirect</a></li>客户端跳转,地址栏变化,显示jsp地址...../r2.jsp
Action跳转:
<li><a href="r/r3">chain</a></li> forward方式访问Action,地址栏显示.../r/r3
<li><a href="r/r4">redirectAction</a></li> 地址栏显示..../r2.jsp
Struts.xml:
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
<action name="r3">
<result type="chain">r1</result>// *r1前不要加/,如果Action在另外包中,则查文档
</action>
<action name="r4">
<result type="redirectAction">r2</result>
</action>
</package>
17.results全局结果集
<ol>
<li><a href="user/user?type=1">返回success</a></li>
<li><a href="user/user?type=2">返回error</a></li>
<li><a href="user/user?type=3">返回global result</a></li>
<li><a href="admin/admin">admin,继承user包</a></li>
</ol>
Struts.xml:
<package name="user" namespace="/user" extends="struts-default">
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
配置的全局结果集在一个package里可以通用。
<action name="index">
<result>/index.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_success.jsp</result>
<result name="error">/user_error.jsp</result>
</action>
</package>
如果想用另一个package中的global-reasults,需要extends那个package的包名。
<package name="admin" namespace="/admin" extends="user">
<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
<result>/admin.jsp</result>
</action>
</package>
UserAction.java:
public class UserAction extends ActionSupport {
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) return "success";
else if (type == 2) return "error";
else return "mainpage";
}
}
18.动态结果集
*一定不要忘了为动态结果的保存值设置set get方法
<ol>
<li><a href="user/user?type=1">返回success</a></li>
<li><a href="user/user?type=2">返回error</a></li>
</ol>
Struts.xml:
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
</package>
UserAction.java:
public class UserAction extends ActionSupport {
private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
19.带参数的结果集
Redirect方式才需要传参数,forward方式不需要。
<li><a href="user/user?type=1">传参数</a></li>
Struts.xml:
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
</action>
</package>
UserAction.java:
public class UserAction extends ActionSupport {
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String execute() throws Exception {
return "success";
}
}
User_Success.jsp:
from valuestack: <s:property value="t"/><br/>
from actioncontext: <s:property value="#parameters.t"/>
只能从ActionContext中取,在valuestack中没有对应的值,不是用一个request对象。 只是传递了参数的值。
<s:debug></s:debug>