struts
的关于method=
{
}
意思详解
<action name= Login_* method= {} class= mailreaderLogin >
中Login_*带*是什么意思?method= {} 带{}这个是什么意思?
====================================================
name= Login_*
代表这个action处理所有以Login_开头的请求
method= {}
根据前面请求Login_methodname调用action中的以methodname命名的方法
class= mailreaderLogin
action的类名称
如jsp文件中请求Login_validateUser的action名称根据上面配置调用action类mailreaderLogin类中方法validateUser()
又如
对于Login_update请求将会调用mailreaderLogin的update()方法
它的用法同webwork中的!符号的作用相当于是一个通配符
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
struts中的路径问题
注意在jsp中/表示tomcat服务器的根目录在strutsxml配置文件中/表示webapp的根路径即MyEclipse web项目中的WebRoot路径
总结
struts中的路径问题是根据action的路径而不是jsp路径来确定所以尽量不要使用相对路径
虽然可以用redirect方式解决但redirect方式并非必要
解决办法非常简单统一使用绝对路径 (在jsp中用requestgetContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的指定basePath
Action Method
配置
<package name=user extends=strutsdefault namespace=/user>
<action name=userAdd class=combjsxtstrutsuseractionUserAction method=add>
<result>/user_add_successjsp</result>
</action>
<action name=user class=combjsxtstrutsuseractionUserAction>
<result>/user_add_successjsp</result>
</action>
</package>
总结
Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法(前者方法)
也可以在url地址中动态指定(动态方法调用DMI )(推荐)(后者方法)
<a <%=context %>/user/userAdd>添加用户
<br />
<a <%=context %>/user/user!add>添加用户
<br />
前者会产生太多的action所以不推荐使用(注<% String context = requestgetContextPath(); %>)
再给个案例大概介绍!使用动态调用DMI的方法即通过!+方法名的指定方法
UserActionjava
import comopensymphonyxworkActionContext;
import javautilMap;
public class UserAction {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
thisuserName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
thispassword = password;
}
public String execute(){
if(!userNameequals(aa)||!passwordequals(aa)){
return error;
}else{
Map session=(Map)ActionContextgetContext()getSession();
sessionput(userName userName);
return success;
}
}
public String loginOther(){
if(!userNameequals(bb)||!passwordequals(bb)){
return error;
}else{
Map session=(Map)ActionContextgetContext()getSession();
sessionput(userName userName);
return success;
}
}
}
strutsxml
<?xml version= encoding=UTF?>
<!DOCTYPE struts PUBLIC
//Apache Software Foundation//DTD Struts Configuration //EN
dtd>
<struts>
<package name=default extends=strutsdefault>
<action name=struts class=orgactionStrutsAction>
<result name=success>/welcomejsp</result>
<result name=error>/hellojsp</result>
<result name=input>/hellojsp</result>
</action>
<action name=user class=orgactionUserAction>
<result name=success>/login_welcomejsp</result>
<result name=error>/login_errorjsp</result>
</action>
<!<action name=loginOther class=orgactionUserAction method=loginOther>
<result name=success>/login_welcomejsp</result>
<result name=error>/login_errorjsp</result>
</action>
>
</package>
</struts>
login_welcomejsp
<%@ page language=java import=javautil* pageEncoding=utf%>
<%@ taglib uri=/strutstags prefix=s %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
<html>
<head>
<title>欢迎</title>
<meta httpequiv=pragma content=nocache>
<meta httpequiv=cachecontrol content=nocache>
<meta httpequiv=expires content=>
<meta httpequiv=keywords content=keywordkeywordkeyword>
<meta httpequiv=description content=This is my page>
<!
<link rel=stylesheet type=text/css >
>
</head>
<body>
<s:set value=#sessionuserName name=userName />
你好!<s:property value=#userName/>
</body>
</html>
login_errorjsp
<%@ page language=java import=javautil* pageEncoding=UTF%>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
<html>
<head>
<title>登陆失败</title>
<meta httpequiv=pragma content=nocache>
<meta httpequiv=cachecontrol content=nocache>
<meta httpequiv=expires content=>
<meta httpequiv=keywords content=keywordkeywordkeyword>
<meta httpequiv=description content=This is my page>
<!
<link rel=stylesheet type=text/css >
>
</head>
<body>
很抱歉!你的登陆失败了!请重新<a >登陆
</body>
</html>
loginjsp
<%@ page language=java import=javautil* pageEncoding=utf%>
<%@ taglib uri=/strutstags prefix=s %>
<%
String path = requestgetContextPath();
String basePath = requestgetScheme()+://+requestgetServerName()+:+requestgetServerPort()+path+/;
%>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
<html>
<head>
<base <%=basePath%>>
<title>struts 应用</title>
<meta httpequiv=pragma content=nocache>
<meta httpequiv=cachecontrol content=nocache>
<meta httpequiv=expires content=>
<meta httpequiv=keywords content=keywordkeywordkeyword>
<meta httpequiv=description content=This is my page>
<!
<link rel=stylesheet type=text/css >
>
</head>
<body>
<s:form action=user!loginOther method=post> 红色部分你如果想调用userAction中的loginOther方法而不想调用execute方法 直接通过 !+方法名即可那你就不用再设置strutsxml中注释掉的部分了这样可以不产生太多的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=strutsdefault namespace=/actions>
<action name=Student* class=combjsxtstrutsactionStudentAction method={}>
<result>/Student{}_successjsp</result>
</action>
<action name=*_* class=combjsxtstrutsaction{}Action method={}>
<result>/{}_{}_successjsp</result>
<! {}_successjsp >
</action>
</package>
{}{}表示第一第二个占位符
*为通配符
通过action name的通配匹配获得占位符可以使用占位符放在result和methodclass中替代匹配的字符
总结
使用通配符将配置量降到最低
<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() {
Systemoutprintln(name= + name);
Systemoutprintln(age= + age);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = age;
}
}
使用Domain Model接收参数
将之前的属性放入到POJO 并设置属性的setter/getter方法
链接使用Domain Model接收参数<a user/user!add?username=a&userage=>添加用户
public class UserAction extends ActionSupport {
private User user;
//private UserDTO userDTO;
public String add() {
Systemoutprintln(name= + usergetName());
Systemoutprintln(age= + usergetAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
thisuser = user;
}
}
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = 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() {
Systemoutprintln(name= + usergetName());
Systemoutprintln(age= + usergetAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
字符编码
配置
<constant name=strutsinencoding value=GBK /> <! internationalization >
在struts中不起作用属于bug在struts中修改
解决方案
修改webxml 中
<filter>
<filtername>struts</filtername>
<! struts中使用filter >
<!<filterclass>orgapachestrutsdispatcherngfilterStrutsPrepareAndExecuteFilter</filterclass>>
<! struts中使用的filter >
<filterclass>orgapachestrutsdispatcherFilterDispatcher</filterclass>
</filter>
=============================================================
Struts一个Action内包含多个请求处理方法的处理(三种方式)
Struts提供了DispatchAction从而允许一个Action内包含多个请求处理方法Struts也提供了类似的功能处理方式主要有以下三种方式
动态方法调用
DMIDynamic Method Invocation 动态方法调用
动态方法调用是指表单元素的action不直接等于某个Action的名字而是以如下形式来指定对应的动作名
<form method=post action=userOpt!loginaction>
则用户的请求将提交到名为userOpt的Action实例Action实例将调用名为login方法来处理请求同时login方法的签名也是跟execute()一样即为public String login() throws Exception
注意要使用动态方法调用必须设置Struts允许动态方法调用通过设置strutsenableDynamicMethodInvocation常量来完成该常量属性的默认值是true
示例
修改用户登录验证示例多增加一个注册用户功能
修改Action类
package orgqiujywebstrutsaction;
import comopensymphonyxworkActionContext;
import comopensymphonyxworkActionSupport;
/**
*@authorqiujy
*@version
*/
publicclass LoginAction extends ActionSupport{
private String userName;
private String password;
private String msg; //结果信息属性