S2.3_Struts2_ActionGetInputFormData Action动作类接收用户输入表单数据的3种实现方式

来源:互联网 发布:最终幻想14神优化 编辑:程序博客网 时间:2024/06/07 23:54
我们接下来将要创建的项目目录结构如下:

由项目S2.2_Struts2_ActionImplementation (如何下载它:点击打开链接)复制粘贴生成一个新项目 ------ S2.3_Struts2_ActionGetInputFormData
详细操作截图参考S1.2_Struts2_ByManual 手工编写第一个Struts2范例篇,位置在项目目录结构图下面。

Action动作类接收用户输入表单数据的3种实现方式
1. 使用Action动作类带get和set字段方法的属性接收用户输入的表单数据

2. 使用Action动作类带get和set对象方法的属性接收用户输入的表单数据(推荐)

3. 使用ModelDriven模式接收用户输入的表单数据 ------ Action类需要实现ModelDriven<T>接口提供的getModel()方法,本例需要实现的接口是ModelDriven<User>


1. 使用Action动作类带get和set方法的属性接收用户输入的表单数据

第1步:在文件WebRoot/login_success.jsp中添加如下一行代码:
<%@ taglib uri="/struts-tags" prefix="s" %>

为何设置uri="/struts-tags" 和 prefix="s"
答:浏览struts2-core-2.2.1.jar/META-INF/struts-tags.tld此文件如下两行内容:
  <short-name>s</short-name>
  <uri>/struts-tags</uri>
  它们之间是一一对应关系。

使用Struts2的值栈技术显示用户输入的内容,login_success.jsp页面代码如下,注意红色字体标识的代码行:

<%@ page language="java" import="java.util.*" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>登录成功</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  <body>
    <center>
    <h1>登录成功</h1>
    <hr>
    欢迎用户:<s:property value="username"/><br>
    密码是:<s:property value="password"/><br>

    </center>
  </body>
</html>

第2步:浏览一下LoginAction.java类代码,它就是使用了Action动作类带get和set方法的属性接收用户输入的表单数据的实现方式:

package net.nw.action;
import net.nw.dao.UserDao;
import net.nw.vo.User;

public class LoginAction {
private String username;//必须与html标签中的名称一样,此处私有变量的值直接来自html标签对应名称填充过来的值
private String password;//必须与html标签中的名称一样,此处私有变量的值直接来自html标签对应名称填充过来的值

public LoginAction(){
System.out.println("构造方法LoginAction ......");
}
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(){
User u = new User();
u.setUsername(this.getUsername());
u.setPassword(this.getPassword());
UserDao dao = new UserDao();
if(dao.userLogin(u)){
return "login_success";
} else{
return "login_failure";
}
}
}

第3步:浏览一下src/struts.xml配置文件代码,注意红色字体标识的部分:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <!-- action的name值必须等于LoginAction.java类命名规范(XxxxAction)中Xxxx,即是Login(首字母要小写) -->
        <action name="login" class="net.nw.action.LoginAction">
            <!-- result的name值必须等于LoginAction.java类里面被重写的execute方法的返回值 -->
            <result name="login_success">/login_success.jsp</result>
            <result name="login_failure">/login_failure.jsp</result>
        </action>
    </package>
</struts>

第4步:发布项目运行程序
此步操作的详细过程参考S1.1_Struts2_Model2 手动创建一个简单的servlet项目,未使用Struts技术 点击打开链接 位置在最下面------发布项目运行程序

若成功发布运行本项目代码,启动后您会看到欢迎页地址:http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action
用户名称:admin
用户密码:123456
点击登录按钮跳转到                            http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

登录成功显示页如下图所示:

输入错误密码或者不输入密码点击登录按钮跳转到  http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

控制台输出以下信息: 

 ...  ...
INFO: Parsing configuration file [struts.xml]
Dec 10, 2016 2:38:28 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /root/Workspaces/MyEclipse2015/.metadata/.me_tcat7/webapps/S2.3_Struts2_ActionGetInputFormData has finished in 2,983 ms
Dec 10, 2016 2:38:28 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Dec 10, 2016 2:38:28 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Dec 10, 2016 2:38:28 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3851 ms
构造方法LoginAction ......
Dec 10, 2016 2:38:31 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

注意:跳转到了目标页面,无论登录成功还是失败,浏览器地址栏都是
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

浏览器地址栏并没有出现我们想象地JSP页面地址:
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login_success.jsp
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login_failure.jsp


2. 使用Action动作类带get和set对象方法的属性接收用户输入的表单数据(推荐)

第1步:修改LoginAction2.java类代码,让Action动作类的对象属性接收表单填充的对象数据,注意html表单字段标签的命名格式:对象 . 字段

package net.nw.action;
import com.opensymphony.xwork2.Action;
import net.nw.dao.UserDao;
import net.nw.vo.User;

public class LoginAction2 implements Action {
private User user;//必须与html标签中对象的名称一样,此处私有对象的值直接来自html标签对应对象名称填充过来的值

public LoginAction2() {
System.out.println("构造方法LoginAction2 ......");
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
// 调用业务层操作类的方法
public String execute() {
UserDao dao = new UserDao();
if (dao.userLogin(user)) {
return "login_success";
} else {
return "login_failure";
}
}
}

第2步:修改WebRoot/login.jsp表单字段name属性值的格式: 对象.字段,注意红色字体标识字段name属性值的格式,WebRoot/login.jsp页面代码如下:

<%@ page language="java" import="java.util.*" %>
<%@ page contentType="text/html; charset=UTF-8" %> 
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>系统登录</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  <body>
        <center>
    <h1>系统登录</h1>
    <hr>
    <form name="loginForm" action="<%=path%>/login.action" method="post" >
    用户名称:<input type="text" name="user.username"/><br>
    用户密码:<input type="password" name="user.password"/><br>
           <input type="submit" value="登录"/><br>
    </form>
    </center>
  </body>
</html>

第3步:修改WebRoot/login_success.jsp页面值栈显示用户输入的内容,不能用字段名称显示,也要使用 对象.字段 的格式来读取用户输入的内容

<%@ page language="java" import="java.util.*" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>登录成功</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  <body>
    <center>
    <h1>登录成功</h1>
    <hr>
    欢迎用户:<s:property value="user.username"/><br>
    密码是:<s:property value="user.password"/><br>
    <s:debug></s:debug><br>
    </center>
  </body>
</html>

第4步:为了让LoginAction2.java 动作类被调用,我们需要同步调整struts.xml配置文件的代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <!-- action的name值必须等于LoginAction.java类命名规范(XxxxAction)中Xxxx,即是Login(首字母要小写) -->
        <action name="login" class="net.nw.action.LoginAction2">
            <!-- result的name值必须等于LoginAction.java类里面被重写的execute方法的返回值 -->
            <result name="login_success">/login_success.jsp</result>
            <result name="login_failure">/login_failure.jsp</result>
        </action>
    </package>
</struts>

第5步:发布项目运行程序

此步操作的详细过程参考S1.1_Struts2_Model2 手动创建一个简单的servlet项目,未使用Struts技术 点击打开链接 位置在最下面------发布项目运行程序

若成功发布运行本项目代码,启动后您会看到欢迎页地址:http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action
用户名称:admin
用户密码:123456
点击登录按钮跳转到                            http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

登录成功显示页如下图所示:

输入错误密码或者不输入密码点击登录按钮跳转到  http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

控制台输出以下信息: 

 ...  ...
INFO: Parsing configuration file [struts.xml]
Dec 10, 2016 3:33:31 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /root/Workspaces/MyEclipse2015/.metadata/.me_tcat7/webapps/S2.3_Struts2_ActionGetInputFormData has finished in 1,870 ms
Dec 10, 2016 3:33:31 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Dec 10, 2016 3:33:31 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Dec 10, 2016 3:33:31 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2655 ms
构造方法LoginAction2 ......
Dec 10, 2016 3:33:37 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

注意:跳转到了目标页面,无论登录成功还是失败,浏览器地址栏都是
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

浏览器地址栏并没有出现我们想象地JSP页面地址:
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login_success.jsp
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login_failure.jsp

3. 使用ModelDriven模式接收用户输入的表单数据 ------ Action类需要实现ModelDriven<T>接口提供的getModel()方法,本例需要实现的接口是ModelDriven<User>

第1步:编辑LoginAction3.java动作类,实现ModelDriven<T>接口提供的getModel()方法,代码如下:

package net.nw.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import net.nw.dao.UserDao;
import net.nw.vo.User;

public class LoginAction3 extends ActionSupport implements ModelDriven<User>{
/**
* 对象序列化需要此serialVersionUID
*/
private static final long serialVersionUID = 1L;
    private User user = new User();//注意:此处user一定要实例化
public LoginAction3() {
System.out.println("构造方法LoginAction3 ......");
}
//调用业务层操作类的方法
public String execute(){
UserDao dao = new UserDao();
if(dao.userLogin(user)){
return "login_success";
} else{
return "login_failure";
}
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}

}

第2步:编辑WebRoot/login.jsp输入表单标签name属性的值,我们不再需要领域对象格式(第2种接收方式)的属性值格式,直接使用字段名称作为html标签的名称值:

<%@ page language="java" import="java.util.*" %>
<%@ page contentType="text/html; charset=UTF-8" %> 
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>系统登录</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  <body>
        <center>
    <h1>系统登录</h1>
    <hr>
    <form name="loginForm" action="<%=path%>/login.action" method="post" >
    用户名称:<input type="text" name="username"/><br>
    用户密码:<input type="password" name="password"/><br>
           <input type="submit" value="登录"/><br>
    </form>
    </center>
  </body>
</html>

第3步:编辑WebRoot/login_success.jsp值栈读取用户输入的内容,直接使用字段名称读取即可,其代码如下:

<%@ page language="java" import="java.util.*" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>登录成功</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  <body>
    <center>
    <h1>登录成功</h1>
    <hr>
    欢迎用户:<s:property value="username"/><br>
    密码是:<s:property value="password"/><br>
    <s:debug></s:debug><br>
    </center>
  </body>
</html>

第4步:为了让LoginAction3.java 动作类被调用,我们需要同步调整struts.xml配置文件的代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <!-- action的name值必须等于LoginAction.java类命名规范(XxxxAction)中Xxxx,即是Login(首字母要小写) -->
        <action name="login" class="net.nw.action.LoginAction3">
            <!-- result的name值必须等于LoginAction.java类里面被重写的execute方法的返回值 -->
            <result name="login_success">/login_success.jsp</result>
            <result name="login_failure">/login_failure.jsp</result>
        </action>
    </package>
</struts>

第5步:发布项目运行程序

此步操作的详细过程参考S1.1_Struts2_Model2 手动创建一个简单的servlet项目,未使用Struts技术 点击打开链接 位置在最下面------发布项目运行程序

若成功发布运行本项目代码,启动后您会看到欢迎页地址:http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action
用户名称:admin
用户密码:123456
点击登录按钮跳转到                            http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

登录成功显示页如下图所示:

输入错误密码或者不输入密码点击登录按钮跳转到  http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

控制台输出以下信息: 

 ...  ...
INFO: Parsing configuration file [struts.xml]
Dec 10, 2016 4:26:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /root/Workspaces/MyEclipse2015/.metadata/.me_tcat7/webapps/S2.3_Struts2_ActionGetInputFormData has finished in 2,198 ms
Dec 10, 2016 4:26:33 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Dec 10, 2016 4:26:33 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Dec 10, 2016 4:26:33 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3048 ms
构造方法LoginAction3 ......

注意:跳转到了目标页面,无论登录成功还是失败,浏览器地址栏都是
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login.action

浏览器地址栏并没有出现我们想象地JSP页面地址:
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login_success.jsp
http://localhost:8080/S2.3_Struts2_ActionGetInputFormData/login_failure.jsp

本项目下载地址:点击打开链接
0 0
原创粉丝点击