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>