示例→基于Struts2的用户注册模块

1.用户注册模块需求描述

  在用户注册页面中填写用户信息,包括用户名、用户密码、确认密码、姓名等信息,填写完成后提交注册表单给Struts 2的业务控制器Action,控制器处理提交的参数并决定跳转页面,若页面跳转到用户信息显示页面,则在该页面中显示用户信息。

2.模块实现

我们用如下表所示的代码文件来实现“用户注册模块”

(1)首先添加一个注册表单页面,该页面用来提交用户注册信息

Register.jsp:

<%@page language="java" pageEncoding="gb2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>用户注册页面</title>
</head>
<body>
<form action="register.action" method="post">
<table>
<tr><td colspan="2"><s:actionerror/></td></tr>
<tr><td>用户名:</td>
<td><input type="text" name="username"></td></tr>
<tr><td>密码:</td>
<td><input type="password" name="upassword"></td></tr>
<tr><td>确认密码:</td>
<td> <input type="password" name="repassword"></td></tr>
<tr><td>姓名:</td>
<td><input type="text" name="name"></td></tr>
<tr><td>年龄:</td>
<td><input type="text" name="age"></td></tr>
<tr><td>出生日期:</td>
<td><input type="text" name="birth"></td></tr>
<tr><td>邮箱地址:</td>
<td><input type="text" name="email"></td></tr>
<tr><td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td></tr>
</table>
</form>
</body>
</html>

(2)添加注册Action,该Action用来接收用户提交的参数,并进行业务逻辑处理,最后进行页面跳转,在这里我们添加如下的判断处理

  A、密码和确认密码必须输入,否则提示错误信息

  B、密码和确认密码必须相同,否则提示错误信息

package com.sanqing.action;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction  extends ActionSupport{
private String username; //用户名信息
private String upassword; //密码信息
private String repassword; //确认密码
private String name; //姓名
private String age; //年龄
private String birth; //出生日期
private String email; //email地址
public String getUsername() { //获得用户名
return username;
}
public void setUsername(String username) {//设置用户名
this.username = username;
}
public String getUpassword() {//获得密码
return upassword;
}
public void setUpassword(String upassword) {//设置密码
this.upassword = upassword;
}
public String getRepassword() {//获得重复密码
return repassword;
}
public void setRepassword(String repassword) {//设置重复密码
this.repassword = repassword;
}
public String getName() {//获得姓名
return name;
}
public void setName(String name) {//设置姓名
this.name = name;
}
public String getAge() {//获得年龄
return age;
}
public void setAge(String age) {//设置年龄
this.age = age;
}
public String getBirth() {//获得出生日期
return birth;
}
public void setBirth(String birth) {//设置出生日期
this.birth = birth;
}
public String getEmail() {//获得email地址
return email;
}
public void setEmail(String email) {//设置email地址
this.email = email;
}
public void validate() {
if(upassword == null || "".equals(upassword)){
this.addActionError("密码必须输入");
}
if(repassword == null || "".equals(repassword)) {
this.addActionError("确认密码必须输入");
}
if(upassword != null && repassword != null && !repassword.equals(upassword)){
this.addActionError("密码和确认密码必须相同");
} }
public String execute() throws Exception {//执行方法
return "success";
}
}

解说:上述代码中添加了一个execute()方法,该方法是Action的执行方法,可以通过在该方法中添加业务逻辑代码或调用业务逻辑方法来完成逻辑操作,同时该方法返回一个普通的字符串,这个字符串对应着配置文件struts.xml中的一个视图文件。

  上述代码中RegisterAction继承了ActionSupport,其目的是为了能够使用ActionSupport中定义的一些方法来完成校验操作,如上述代码中RegisterAction实现了ActionSupport的validate()方法,在validate()方法中添加输入校验代码来判断密码和确认密码是否输入及是否相同,其中通过ActionSupport的addActionError()方法来添加错误信息。

(3)添加完Action后,需要在struts.xml文件中配置该Action,包括请求地址和处理结果与视图资源之间的关系

<?xml version="1.0" encoding="UTF-8" ?><!-- XML声明 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd"><!-- 指定Struts 2配置文件的DTD信息 -->
<struts><!-- 根节点 -->
<constant name="struts.i18n.encoding" value="gb2312"></constant>
<package name="struts2" extends="struts-default">
<!-- 定义register的Action,其实现类为com.sanqing.action.RegisterAction-->
<action name="register" class="com.sanqing.action.RegisterAction">
<!-- 定义处理结果与视图资源之间的关系-->
<result name="success">/ShowUserInfo.jsp</result>
<result name="input">/Register.jsp</result>
</action>
</package>
</struts>

解说:上述代码定义了一个"input"处理结果,其对应的页面为Register.jsp,也就是用户注册页面。在前面的业务控制器RegisterAction中并没有返回“input”结果,如何会自动跳转到注册页面呢?这个与Struts 2的拦截机制有关,当代码中使用了addActionError()方法添加错误信息时,Struts 2会自动发现这些错误信息,并返回结果“input”,在前面的Register.jsp页面中有输出校验错误语句:<s:actionerror/>。

  <s:actionerror/>是属于Struts 2标签库中的标签,用来输出ActionError中的错误信息,因为在用户注册页面Register.jsp中使用了Struts 2的标签库,所以还需要使用taglib指令来引入标签库,代码如下:

<%@taglib prefix="s" uri="/struts-tags"%>

该标签指令表示Struts 2的所有标签都是用"s"作为前缀,Struts的标签库的URI为"/struts-tags"。

(4)添加结果显示页,在该结果页面中显示用户提交的所有参数

ShowUserInfo.jsp:

<%@page language="java" pageEncoding="gb2312"%>
<html>
<head>
<title>用户信息</title>
</head>
<body>
用户名:${username}<br> <!-- 显示用户名信息 -->
密码:${upassword}<br> <!-- 显示密码信息 -->
确认密码:${repassword}<br> <!-- 显示确认密码信息 -->
姓名:${name}<br> <!-- 显示姓名信息 -->
年龄:${age}<br> <!-- 显示年龄信息 -->
出生日期:${birth}<br> <!-- 显示出生日期信息 -->
邮箱地址:${email}<br> <!-- 显示邮箱地址信息 -->
</body>
</html>

解说:在上述代码中使用了EL表达式,使用时没有指定范围,而是直接使用${username},这时EL将默认从page范围开始查找,如果找不到,再依次到request、session、application范围中找,如果没有找到就返回null,在网页中也就没有显示。

3.功能测试

  打开浏览器,在浏览器地址栏中输入 http://localhost:8080/StrutsPro/Register.jsp打开用户注册页面,不输入任何用户信息,单击“提交”按钮进行注册,弹出错误提示页面,提示“密码必须输入”和“确认密码必须输入”等信息

小结

(1)为什么在struts.xml中定义包时需要继承struts-default包?

答:Struts 2中的所有Action都必须定义在包(package)下,在struts-default包中定义了许多Struts 2的默认配置,如拦截器、返回结果类型等,通过继承struts-default包可以使用这些默认配置。

(2)Struts 2的Action为什么能自动获得参数值?

答:这个与Struts2的拦截器有关,Struts 2通过拦截器机制对参数进行拦截,并通过参数名称在相应Action中寻找匹配的setter方法将参数值设置上,Action中的属性名称必须和表单提交参数保持一致。

(3)提交中文参数值时得到的是乱码,该如何处理?

答:需要在配置文件struts.xml中配置参数编码格式,在package包前添加如下代码:

<constant name="struts.i18n.encoding" value="gb2312"></constant>

Struts 2(三):示例→基于Struts 2的用户注册模块的更多相关文章

  1. GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台

    注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...

  2. Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录

    第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...

  3. Struts入门(三)深入Struts用法讲解

    访问Servlet API Action搜索顺序 动态方法调用 指定多个配置文件 默认Action Struts 后缀 接收参数 处理结果类型 1.访问Servlet API 首先我们了解什么是Ser ...

  4. (三)、Struts第三天

    (三).Struts第三天 Struts核心业务: (Struts提供了哪些功能?) 1.  请求数据自动封装(params拦截器) 2.  struts数据处理方式 * ActionContext ...

  5. 简述基于Struts框架Web应用的工作流程

    简述基于Struts框架Web应用的工作流程 解答:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们 ...

  6. Struts2(三) 配置struts.xml的提示(在不联网的情况下)

    开发过程中如果可以上网,struts.xml 会自动缓存dtd,提供提示功能.如果不能联网需要我们配置本地dtd,这样才能让struts2 产生提示 1.首先,在EClipse中依次点击工具栏中的wi ...

  7. 基于struts环境下的jquery easyui环境搭建

    下载地址: http://download.csdn.net/detail/cyberzhaohy/7348451 加入了json包:jackson-all-1.8.5.jar,项目结构例如以下: 測 ...

  8. Struts框架——(二)Struts原理with登录实例

    二. Struts基本工作流程 假设现在有以下情景: 用户正在浏览一个用STRUTS的技术构建的网站主页,主页上有个登陆表单,用户填好登陆名和密码,单击"登陆"按钮,就激活了以下一 ...

  9. GJM :用JIRA管理你的项目(三)基于LDAP用户管理 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. spring中的default-lazy-init参数和lazy-init

    在spring的配置中的根节点上有个  default-lazy-init="true"配置:   1.spring的default-lazy-init参数  此参数表示延时加载, ...

  2. 搭建Hexo博客系统

    也许这个教程部署不是特别详细,因为我主要是参考这个链接:https://blog.csdn.net/weixin_39879178/article/details/80319392 感觉这里已经写的很 ...

  3. Apollo2.5 CANBUS调试笔记(测试版)

    前言:CANBUS是Apollo需要根据你的底盘写代码的地方,感觉也是Apollo最难调试的部分.这部分首先要选好CAN卡,因为不是Apollo推荐的CAN卡,驱动程序和对应接口,可能都需要自己调整, ...

  4. Unity3D-射线效果

    基于airplane_02 下面新建 Line Renderer 将上面的几个地方设置下 添加Script脚本: 脚本代码为: using System.Collections; using Syst ...

  5. [LuoguP1034][Noip2002] 矩形覆盖

    [LuoguP1034][Noip2002] 矩形覆盖(Link) 在平面上有\(N\)个点,\(N\)不超过五十, 要求将这\(N\)个点用\(K\)个矩形覆盖,\(k\)不超过\(4\),要求最小 ...

  6. LoadRunner调用java函数测试oracle

    LoadRunner调用java函数测试oracle 测试oracle的方法有很多,可以使用loadrunner的oracle协议直接调用oracle进行测试,也可以调用开发的java程序对oracl ...

  7. 使用Docker发布.NET CORE API

    1.使用VS 2015 新建了一个Core API项目,然后把他的依赖升级到最新(我机器VS 2015默认的包都是rc版本),然后publish. 2.在publish目录的同级目录下,新建Docke ...

  8. 我的QT5学习之路(一)——浅谈QT的安装和配置

    一.前言 说到Qt,不能不说到C++,这门伟大的语言.因为其面向对象的编程思想和陡峭的学习曲线,一开始学习起来很是吃力.Qt从QT4开始基本封装了很多C++的工具库和界面库,而且支持跨平台,这是它最大 ...

  9. STM32F103 ucLinux开发之三(内核启动后不正常)(完结)

    STM32F103 ucLinux内核没有完全启动 从BOOT跳转到内核后,执行一长段的汇编语言,然后来到startkernel函数,开启C语言之旅. 但是内核输出不正常,如下所示: Linux ve ...

  10. Android SDK 的SDK Manager打不开,一闪就退,无法启动,解决方法

    前一分钟还能打开,在eclipse中点了更新SDK后就启不动了 看下目录的修改时间,tool目录已经是今天的时间, 在升级过程中修改过了,给他改名 tempToolsDir 改名为tool 再尝试下启 ...