Struts2(五.用户注册的实现及整合Action的配置方法)

时间:2022-01-07 05:40:59

一.用户注册功能

register.jsp页面

若是jquery ajax方式提交给action,还要回到jquery,控制权在jquery
若是表单方式提交给action,控制权交给action

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
<script type="text/javascript" src="jslib/jquery-1.11.1.js"></script>
<script type="text/javascript">
$(function(){
$("[name='user.userName']").blur(function(){
if($.trim($(this).val())=="")
{
$("[name='user.userName']").select();
$("[name='user.userName']").focus();
$("#msg").html("请输入用户名!");
return false;
}
$.post("${pageContext.request.contextPath}/user/checkExists",{"user.userName":$(this).val()},function(data){
$("[name='isExists']").val(data)
if(data=="1")
{
$("#msg").html("用户名已存在,请重新输入!");
}
});
});
$("[type='submit']").click(function(){
if($.trim($("[name='user.userName']").val())=="")
{
$("[name='user.userName']").select();
$("[name='user.userName']").focus();
$("#msg").html("请输入用户名!");
return false;
}
if($("[name='isExists']").val()=="1")
{
$("[name='user.userName']").select();
$("[name='user.userName']").focus();
$("#msg").html("用户名已存在,请重新输入!");
return false;
}
if($.trim($("[name='user.pwd']").val())=="")
{
$("[name='user.pwd']").select();
$("[name='user.pwd']").focus();
$("#msg").html("请输入密码!");
return false;
}
return true;
});
});
</script>
</head>
<body>
用户注册
<br>
<br>
<!-- 表单提交后控制权就在Action中了 -->
<form method="post" action="${pageContext.request.contextPath}/user/add">
<table>
<tr><td>用户名:</td><td><input type="text" name="user.userName"></td></tr>
<tr><td>密码:</td><td><input type="password" name="user.pwd"></td></tr>
<tr><td colspan="2"><input type="submit" value="提交"></td></tr>
</table>
</form>
<!-- 隐藏变量,用来判断用户名是否重复,不写在表单中,因为action中没有接收的属性-->
<input type="hidden" name="isExists" value="0"/>
<div id="msg"></div>
<br>
<br>
<a href="${pageContext.request.contextPath}/main.jsp">返回主页面</a>
</body>
</html>

2.UserAction

  /**
* 注册用户
* @return
* @throws Exception
*/
public String add() throws Exception {
UserDAO dao=new UserDAO();
dao.addUser(user);
return "userlist";
}

3.UserDAO

    /**
* 注册用户
* @param user
* @throws SQLException
*/
public void addUser(User user) throws SQLException
{
sql="insert into users(userName,pwd) value(?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1, user.getUserName());
ps.setString(2, user.getPwd());
ps.execute();
conn.close();
}

4.struts.xml

在struts2.x中,action中return转走需要在struts.xml中配置result

<?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>
<!-- struts2常量 -->
<!-- 控制请求action时的后缀,默认为空或者.action -->
<constant name="struts.action.extension" value="action,,"/>
<!-- 控制开发模式,默认为false,若为true则表示改了action后可以不重启-->
<constant name="struts.devMode" value="true"/>
<!-- 控制上传文件大小 3个0表示Kb,6个0表示Mb,这里为10Mb-->
<constant name="struts.multipart.maxSize" value="10000000"/> <!--
package:管理action
name:名称,今后别的人可以继承这个package
namespace:路径,调action的时候也要加上才能调用
extends:继承于哪个包
-->
<package name="all" namespace="" extends="struts-default">
<!-- 控制action中全局跳转 -->
<global-results>
<!-- redirectAction容器外跳转,跳action -->
<result name="userlist" type="redirectAction">
<param name="namespace">/user</param>
<param name="actionName">list</param>
</result>
</global-results>
</package>
<include file="user.xml"></include>
<include file="picture.xml"></include>
</struts>

5.user.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="user" namespace="/user" extends="all"> <!-- 通配符方式配置action,解决action太多的问题 -->
<action name="*" class="myuser.UserAction" method="{1}">
<!-- 控制action中局部跳转 -->
<result name="main">${pageContext.request.contextPath}/main.jsp</result>
<result name="login">${pageContext.request.contextPath}/login.jsp</result>
<!--
加了type="redirect"代表,容器外跳转
容器外跳转跳不到userlist.jsp中去
在这里只能用容器内跳转(同一个request范围之内)
-->
<result name="list">/WEB-INF/user/userlist.jsp</result>
<result name="modify">/WEB-INF/user/modify.jsp</result>
</action>
</package>
</struts>

二.整合Action的配置方法(解决action太多的问题)

建立UserAction类

方法一:method方式

建立一个Action类,在类中编写不同的方法,在不同的方法中处理不同的请求。

在struts.xml中配置method属性,让不同的action指向同一个Action类的不同方法。

ex:

xml:

<action name="adduser" class="myuser.UserAction" method="add">

方法二:感叹号方式
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
不需要配置method,直接用!方法名的方式来调用。

DynamicMethodInvocation =动态方法调用

ex:

xml:

<action name="user" class="myuser.UserAction">

调用:

$.post("user!checkExists",{"user.userName":$(this).val()},function(data){
}

方法三:通配符方式(官网推荐) “约定大于配置”(本项目使用此方法)

<action name="*" class="myuser.UserAction" method="{1}">