struts
的關於method=
{
}
意思詳解
<action name=
Login_*
method=
{
}
class=
mailreader
Login
>
中Login_*帶*是什麼意思?method=
{
}
帶{}這個是什麼意思?
====================================================
name=
Login_*
代表這個action處理所有以Login_開頭的請求
method=
{
}
根據前面請求Login_methodname
調用action中的以methodname命名的方法
class=
mailreader
Login
action的類名稱
如jsp文件中請求Login_validateUser的action名稱
根據上面配置
調用action類mailreader
Login類中方法validateUser()
又如
對於Login_update請求
將會調用mailreader
Login的update()方法
它的用法同webwork中的!符號的作用
相當於是一個通配符
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
struts
中的路徑問題
注意
在jsp中
/
表示tomcat服務器的根目錄
在struts
xml配置文件中
/
表示webapp的根路徑
即MyEclipse web項目中的WebRoot路徑
總結
struts
中的路徑問題是根據action的路徑而不是jsp路徑來確定
所以盡量不要使用相對路徑
雖然可以用redirect方式解決
但redirect方式並非必要
解決辦法非常簡單
統一使用絕對路徑
(在jsp中用request
getContextRoot方式來拿到webapp的路徑)
或者使用myeclipse經常用的
指定basePath
Action Method
配置
<package name=
user
extends=
struts
default
namespace=
/user
>
<action name=
userAdd
class=
com
bjsxt
struts
user
action
UserAction
method=
add
>
<result>/user_add_success
jsp</result>
</action>
<action name=
user
class=
com
bjsxt
struts
user
action
UserAction
>
<result>/user_add_success
jsp</result>
</action>
</package>
總結
Action執行的時候並不一定要執行execute方法
可以在配置文件中配置Action的時候用method=來指定執行哪個方法(前者方法)
也可以在url地址中動態指定(動態方法調用DMI )(推薦)(後者方法)
<a <%=context %>/user/userAdd
>添加用戶
<br />
<a <%=context %>/user/user!add
>添加用戶
<br />
前者會產生太多的action
所以不推薦使用
(注
<% String context = request
getContextPath(); %>)
再給個案例
大概介紹!使用動態調用DMI的方法
即通過!+方法名的指定方法
UserAction
java
import com
opensymphony
xwork
ActionContext;
import java
util
Map;
public class UserAction {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this
userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this
password = password;
}
public String execute(){
if(!userName
equals(
aa
)||!password
equals(
aa
)){
return
error
;
}else{
Map session=(Map)ActionContext
getContext()
getSession();
session
put(
userName
userName);
return
success
;
}
}
public String loginOther(){
if(!userName
equals(
bb
)||!password
equals(
bb
)){
return
error
;
}else{
Map session=(Map)ActionContext
getContext()
getSession();
session
put(
userName
userName);
return
success
;
}
}
}
struts
xml
<?xml version=
encoding=
UTF
?>
<!DOCTYPE struts PUBLIC
//Apache Software Foundation//DTD Struts Configuration
//EN
dtd
>
<struts>
<package name=
default
extends=
struts
default
>
<action name=
struts
class=
org
action
StrutsAction
>
<result name=
success
>/welcome
jsp</result>
<result name=
error
>/hello
jsp</result>
<result name=
input
>/hello
jsp</result>
</action>
<action name=
user
class=
org
action
UserAction
>
<result name=
success
>/login_welcome
jsp</result>
<result name=
error
>/login_error
jsp</result>
</action>
<!
<action name=
loginOther
class=
org
action
UserAction
method=
loginOther
>
<result name=
success
>/login_welcome
jsp</result>
<result name=
error
>/login_error
jsp</result>
</action>
>
</package>
</struts>
login_welcome
jsp
<%@ page language=
java
import=
java
util
*
pageEncoding=
utf
%>
<%@ taglib uri=
/struts
tags
prefix=
s
%>
<!DOCTYPE HTML PUBLIC
//W
C//DTD HTML
Transitional//EN
>
<html>
<head>
<title>歡迎</title>
<meta http
equiv=
pragma
content=
no
cache
>
<meta http
equiv=
cache
control
content=
no
cache
>
<meta http
equiv=
expires
content=
>
<meta http
equiv=
keywords
content=
keyword
keyword
keyword
>
<meta http
equiv=
description
content=
This is my page
>
<!
<link rel=
stylesheet
type=
text/css
>
>
</head>
<body>
<s:set value=
#session
userName
name=
userName
/>
你好!<s:property value=
#userName
/>
</body>
</html>
login_error
jsp
<%@ page language=
java
import=
java
util
*
pageEncoding=
UTF
%>
<!DOCTYPE HTML PUBLIC
//W
C//DTD HTML
Transitional//EN
>
<html>
<head>
<title>登陸失敗</title>
<meta http
equiv=
pragma
content=
no
cache
>
<meta http
equiv=
cache
control
content=
no
cache
>
<meta http
equiv=
expires
content=
>
<meta http
equiv=
keywords
content=
keyword
keyword
keyword
>
<meta http
equiv=
description
content=
This is my page
>
<!
<link rel=
stylesheet
type=
text/css
>
>
</head>
<body>
很抱歉!你的登陸失敗了!請重新<a >登陸
</body>
</html>
login
jsp
<%@ page language=
java
import=
java
util
*
pageEncoding=
utf
%>
<%@ taglib uri=
/struts
tags
prefix=
s
%>
<%
String path = request
getContextPath();
String basePath = request
getScheme()+
://
+request
getServerName()+
:
+request
getServerPort()+path+
/
;
%>
<!DOCTYPE HTML PUBLIC
//W
C//DTD HTML
Transitional//EN
>
<html>
<head>
<base <%=basePath%>
>
<title>struts
應用</title>
<meta http
equiv=
pragma
content=
no
cache
>
<meta http
equiv=
cache
control
content=
no
cache
>
<meta http
equiv=
expires
content=
>
<meta http
equiv=
keywords
content=
keyword
keyword
keyword
>
<meta http
equiv=
description
content=
This is my page
>
<!
<link rel=
stylesheet
type=
text/css
>
>
</head>
<body>
<s:form action=
user!loginOther
method=
post
> 紅色部分
你如果想調用userAction中的loginOther方法而不想調用execute方法
直接通過 !+方法名即可
那你就不用再設置struts
xml中注釋掉的部分了
這樣可以不產生太多的action
<s:textfield name=
userName
label=
請輸入姓名
></s:textfield> <s:textfield name=
password
label=
請輸入密碼
></s:textfield>
<s:submit value=
提交
></s:submit>
</s:form>
</body>
</html>
Action Wildcard(Action 通配符)
配置
<package name=
actions
extends=
struts
default
namespace=
/actions
>
<action name=
Student*
class=
com
bjsxt
struts
action
StudentAction
method=
{
}
>
<result>/Student{
}_success
jsp</result>
</action>
<action name=
*_*
class=
com
bjsxt
struts
action
{
}Action
method=
{
}
>
<result>/{
}_{
}_success
jsp</result>
<!
{
}_success
jsp
>
</action>
</package>
{
}
{
}表示第一第二個占位符
*為通配符
通過action name的通配匹配
獲得占位符
可以使用占位符放在result和method
class中替代匹配的字符
總結
使用通配符
將配置量降到最低
<a <%=context %>/actions/Studentadd
>添加學生
<a <%=context %>/actions/Studentdelete
>刪除學生
不過
一定要遵守
約定優於配置
的原則
<a <%=context %>/actions/Teacher_add
>添加老師
<a <%=context %>/actions/Teacher_delete
>刪除老師
<a <%=context %>/actions/Course_add
>添加課程
<a <%=context %>/actions/Course_delete
>刪除課程
接收參數值
使用action屬性接收參數
只需在action加入getter/setter方法
如參數name=a
接受到參數必須有getName/setName方法
鏈接
<a user/user!add?name=a&age=
>
public class UserAction extends ActionSupport {
private String name;
private int age;
public String add() {
System
out
println(
name=
+ name);
System
out
println(
age=
+ age);
return SUCCESS;
}
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;
}
}
使用Domain Model接收參數
將之前的屬性放入到POJO
並設置屬性的setter/getter方法
鏈接
使用Domain Model接收參數<a user/user!add?user
name=a&user
age=
>添加用戶
public class UserAction extends ActionSupport {
private User user;
//private UserDTO userDTO;
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;
}
}
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;
}
}
使用ModelDriven接收參數
Action實現ModelDriven接口
實現getModel()方法
這樣user需要自己new出來
getModel返回user
鏈接
使用ModelDriven接收參數<a user/user!add?name=a&age=
>添加用戶
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;
}
}
字符編碼
配置
<constant name=
struts
i
n
encoding
value=
GBK
/> <!
internationalization
>
在struts
中不起作用
屬於bug
在struts
中修改
解決方案
修改web
xml 中
<filter>
<filter
name>struts
</filter
name>
<!
struts
中使用filter
>
<!
<filter
class>org
apache
struts
dispatcher
ng
filter
StrutsPrepareAndExecuteFilter</filter
class>
>
<!
struts
中使用的filter
>
<filter
class>org
apache
struts
dispatcher
FilterDispatcher</filter
class>
</filter>
=============================================================
Struts
一個Action內包含多個請求處理方法的處理(三種方式)
Struts
提供了DispatchAction
從而允許一個Action內包含多個請求處理方法
Struts
也提供了類似的功能
處理方式主要有以下三種方式
動態方法調用
DMI
Dynamic Method Invocation 動態方法調用
動態方法調用是指
表單元素的action不直接等於某個Action的名字
而是以如下形式來指定對應的動作名
<form method=
post
action=
userOpt!login
action
>
則用戶的請求將提交到名為
userOpt
的Action實例
Action實例將調用名為
login
方法來處理請求
同時login方法的簽名也是跟execute()一樣
即為public String login() throws Exception
注意
要使用動態方法調用
必須設置Struts
允許動態方法調用
通過設置struts
enable
DynamicMethodInvocation常量來完成
該常量屬性的默認值是true
示例
修改用戶登錄驗證示例
多增加一個注冊用戶功能
修改Action類
package org
qiujy
web
struts
action;
import com
opensymphony
xwork
ActionContext;
import com
opensymphony
xwork
ActionSupport;
/**
*@authorqiujy
*@version
*/
publicclass LoginAction extends ActionSupport{
private String userName;
private String password;
private String msg; //結果信息屬性
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28083.html