转载本人163博客,因工作时间只能访问技术站
http://chaoji-liangbin.blog.163.com/blog/static/252392122010102945649963/
1、动态执行action的执行方法
参考:http://apps.hi.baidu.com/share/detail/12542696
struts2的动态方法调用概括起来有三种方式,下面介绍:
1.1 第一种方式:设置method属性
在Action类中定义一个签名与execute方法相同、只是名字不同的方法,如定义为:
public String checkLogin(){
System.out.println("登录成功...++++");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
List sysusers = sysuserService.getSysuser(username, password);
if (sysusers != null && sysusers.size() > 0) {
return "login_success";
} else {
super.addFieldError("feedback", "用户名或密码错误");
return ERROR;
}
}
然后在struts.xml文件中加一个<action>元素,并设置它的method属性。代码如下(核心代码):
<action name="login" class="loginAction" method="checkLogin" >
<result name="success" type="redirect">/success.jsp</result>
<result name="error">/index.jsp</result>
<result name="input">/index.jsp</result>
</action>
Web.xml中定义的过滤器如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
index.jsp如下:
<s:form action="login!checkLogin.action" name="form1">
<s:textfield name="username" label="username"></s:textfield>
<s:password name="password" label="password"></s:password>
<s:submit value="提交" label="submit"></s:submit>
<s:label name="feedback"></s:label>
</s:form>
清单1:struts.xml部分内容
然后在JSP中表单的action设置为loginMethod。这样,Struts2就会去调用LoginAction中的loigin方法,而不会去调用execute()方法。
1.2、第二种方式:改变表单的action的设置内容
同第一种方式,定一个login方法。只是不需要改变struts.xml文件的内容。然后,在JSP页面中,设置表单的action为loginMethod!login.action。这样,Struts2也会去调用login方法,而不调用execute方法。其中,表单action="loginMethod!login.action" 中,loginMethod为struts.xml文件中<action> 元素的name属性值,login.action中的login为Action类中的方法名。注意:login.action的action不能少。
方法不变。
public String checkLogin(){
System.out.println("登录成功...----");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
List sysusers = sysuserService.getSysuser(username, password);
if (sysusers != null && sysusers.size() > 0) {
return "login_success";
} else {
super.addFieldError("feedback", "用户名或密码错误");
return ERROR;
}
}
在struts.xml中定义如下:
<action name="login" class="loginAction">
<result name="success" type="redirect">/success.jsp</result>
<result name="login_success" type="redirect">/success.jsp</result>
<result name="error">/index.jsp</result>
<result name="input">/index.jsp</result>
</action>
index.jsp如下:
<s:form action="login!checkLogin.action" name="form1">
<s:textfield name="username" label="username"></s:textfield>
<s:password name="password" label="password"></s:password>
<s:submit value="提交" label="submit"></s:submit>
<s:label name="feedback"></s:label>
</s:form>
3、第三种方式:使用通配符(未测试)
首先同上面两种方式,定一个login方法,然后在struts.xml文件中配置如下内容:
<action name="*Action"
class="com.xuxinhua1984.struts2.i18n.LoginAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
清单2:struts.xml部分内容
然后在JSP页面中,设置表单的action为loginAction,此处login为Action类中的方法名,这样struts.xml中的*Action就可以和loginAction模糊匹配了,然后,method="{1}"就相当于method="login"。这样一来就回到了第一种方式。
另外,这种方式甚至结果类型对应的物理视图都可以用通配符。例如,如果想让登录失败后返回登录页,可以设置<result name="error">/{1}.jsp</result>。这样,此处的{1}也会被*号实际的内容替代,此处为login,所以就转发回login.jsp页面了。
总结:对于以上三种方式,我个人建议使用第一、第二种方式,感觉第三种方式是比较灵活,但是也容易产生混乱,且容易出错。
2.表单直接传递对象
Index.jsp:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户登录</title>
<script type="text/javascript">
function refresh(){
document.getElementById("autoImg").src = 'autoImg?now=' + new Date();
}
</script>
</head>
<body>
<s:form action="login!checkLogin.action" name="sysuser">
<s:textfield name="sysuser.account" ></s:textfield>
<s:password name="sysuser.password" ></s:password>
<s:submit value="提交" label="submit"></s:submit>
<s:label name="feedback"></s:label>
</s:form>
验证码:
<span οnclick="refresh();"><img src="autoImg" id="autoImg" style="cursor: pointer;">
</span>
</body>
</html>
注意:
<s:textfield name="sysuser.account" ></s:textfield>
<s:password name="sysuser.password" ></s:password>
sysuser是action类中定义的对象名。account和password是该对象拥有的属性,这样就可以传递对象了。详细请见action:
package com.wenbin.example;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.wenbin.entry.Sysuser;
import com.wenbin.service.ISysuserService;
public class Login extends ActionSupport {
private static final long serialVersionUID = 1L;
private ISysuserService sysuserService;
// private String username;
// private String password;
private Sysuser sysuser;
// 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 checkLogin() {
System.out.println("登录成功...----");
// System.out.println("用户名:" + username);
// System.out.println("密码:" + password);
// // HttpServletRequest request = ServletActionContext.getRequest ();
// //获取request
// Map
// session=(Map)ActionContext.getContext().get(ActionContext.SESSION);
// System.out.println("rand:"+session.get("rand"));
// sysuser = (Sysuser)session.get("sysuser");
System.out.println("用户名:" + sysuser.getAccount() + "....");
System.out.println("密码:" + sysuser.getPassword() + "....");
List sysusers = sysuserService.getSysuser(sysuser.getAccount(), sysuser
.getPassword());
if (sysusers != null && sysusers.size() > 0) {
return "login_success";
} else {
super.addFieldError("feedback", "用户名或密码错误");
return ERROR;
}
// return "login_success";
}
public String execute() {
System.out.println("登录成功...----");
// System.out.println("用户名:" + username);
// System.out.println("密码:" + password);
// // HttpServletRequest request = ServletActionContext.getRequest ();
// //获取request
// Map
// session=(Map)ActionContext.getContext().get(ActionContext.SESSION);
// System.out.println("rand:"+session.get("rand"));
// sysuser = (Sysuser)session.get("sysuser");
System.out.println("用户名:" + sysuser.getAccount() + "....");
System.out.println("密码:" + sysuser.getPassword() + "....");
List sysusers = sysuserService.getSysuser(sysuser.getAccount(), sysuser
.getPassword());
if (sysusers != null && sysusers.size() > 0) {
return "login_success";
} else {
super.addFieldError("feedback", "用户名或密码错误");
return ERROR;
}
}
// @Override
// public void validate() {
// if (username == null || username.equals("")) { //
// 这种验证,对应返回input这个名的页面,必须在struts.xml中定义<result
// name="input">/index.jsp</result>这个属性
// super.addActionError("用户名不能为空");
// super.addFieldError("feedback", "用户名不能为空");
// }
// if (password == null || password.equals("")) {// 这种验证,对应返回input这个名的页面
// super.addActionError("密码不能为空");
// super.addFieldError("feedback", "密码不能为空");
// }
// }
public static void main(String[] args) {
// Configuration 负责管理 Hibernate 配置讯息
Configuration config = new Configuration().configure();
// 根据 config 建立 SessionFactory
// SessionFactory 将用于建立 Session
SessionFactory factory = config.buildSessionFactory();
// 开启Session,相当于开启JDBC 的Connection
Session session = factory.openSession();
Query query = session.createQuery("from Sysuser where password=?"); // Sysuser是持久化对象,
query.setParameter(0, "111111");
List<Sysuser> list = query.list();
for (Sysuser sysuser : list) {
System.out.println(sysuser.getAccount());
}
session.close();
}
public void setSysuserService(ISysuserService sysuserService) {
this.sysuserService = sysuserService;
}
public ISysuserService getSysuserService() {
return sysuserService;
}
public Sysuser getSysuser() {
return sysuser;
}
public void setSysuser(Sysuser sysuser) {
this.sysuser = sysuser;
}
}
直接获取,直接读取该对象。