1:Struts2表单数据校验:

  (1)前台校验,也称之为客户端校验,主要是通过Javascript编程的方式进行数据的验证。

  (2)后台校验,也称之为服务器校验,这里指的是使用Struts2通过xml配置的方式进行表单数据的校验。

  (3)代码方式验证Action中所有的方法;代码方式验证Action中指定的方法;xml方式验证Action中所有的方法;xml方式验证Action中指定的方法;

2:代码方式验证Action中所有的方法(自己记得导jar包和我配置web.xml文件,自己脑补吧):

注册的jsp页面:

 <%@ 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>
</head>
<body> <form action="${pageContext.request.contextPath}/data_checkData.action" method="post">
账号:<input type="text" name="user.name"/><br/>
密码:<input type="password" name="user.password"/><br/>
邮箱:<input type="text" name="user.email"/><br/>
生日:<input type="text" name="user.birthday"/><br/> <input type="submit" value="注册"/>
<input type="reset" value="重置"/>
</form> </body>
</html>

数据校验的Action类的实现:

 package com.bie.lesson10;

 import com.opensymphony.xwork2.ActionSupport;

 /**
* @author Author:别先生
* @date Date:2017年9月24日 下午3:28:25
*
* 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口;
*/
public class CheckAction extends ActionSupport{ /**
*
*/
private static final long serialVersionUID = 1L; //封装请求数据
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
} //重写数据校验的功能
@Override
public void validate() {
//用户名非空校验
if(user.getName() == null || "".equals(user.getName())){
//保存错误信息
super.addFieldError("name", "用户的账号不能为空。");
}
//密码非空校验
if(user.getPassword() == null || "".equals(user.getPassword())){
//保存错误信息
super.addFieldError("password", "用户的密码不能为空");
}
//用户的邮箱校验
/*if(user.getEmail() == null || "".equals(user.getEmail())){
//保存错误信息
super.addFieldError("email", "用户的邮箱不能为空");
}*/
//用户的生日不能为空
/*if(user.getBirthday() == null || "".equals(user.getBirthday())){
//保存错误信息
super.addFieldError("birthday" , "用户的生日不能为空");
}*/ } //业务方法
public String checkData(){ System.out.println(user);
return SUCCESS;
} }

struts2的配置xml文件:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="checkPackage" extends="struts-default">
<action name="data_*" class="com.bie.lesson10.CheckAction" method="{1}">
<result name="success">success2.jsp</result>
<result name="input">error.jsp</result>
</action> </package> </struts>
 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!-- struts在允许的时候会加载这个总配置文件:src/struts.xml --> <!-- 全局配置 -->
<!-- 修改Struts的默认访问后缀 -->
<!-- <constant name="struts.action.extension" value="action,do,struts,"></constant> -->
<include file="constant.xml"></include> <!-- 在总配置文件中引入其他所有的配置文件 --> <!-- <include file="com/bie/lesson/helloStruts.xml"></include> --> <!-- <include file="com/bie/lesson02/strutsAction.xml"></include> --> <!-- <include file="com/bie/lesson03/strutsConfig.xml"></include> --> <!-- <include file="com/bie/lesson04/strutsData.xml"></include> --> <!-- <include file="com/bie/lesson05/strutsType.xml"></include> --> <!-- <include file="com/bie/lesson06/strutsUpload.xml"></include> --> <!-- <include file="com/bie/lesson07/strutsInterceptor.xml"></include> --> <!-- <include file="com/bie/lesson08/action/strutsAdmin.xml"></include> --> <!-- <include file="com/bie/lesson09/strutsOgnl.xml"></include> --> <include file="com/bie/lesson10/strutsCheck.xml"></include> </struts>

用户的实体类的内容:

 package com.bie.lesson10;

 import java.util.Date;

 /**
* @author Author:别先生
* @date Date:2017年9月24日 下午3:59:21
*
*
*/
public class User { private String name;
private String password;
private String email;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public User(String name, String password, String email, Date birthday) {
super();
this.name = name;
this.password = password;
this.email = email;
this.birthday = birthday;
}
public User() {
super();
} }

成功的页面和失败的页面:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>struts2 hello </title>
</head>
<body> <h1>成功注册</h1> <!-- struts的调试标签:可以观测值栈数据 -->
<s:debug></s:debug>
</body>
</html>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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>Insert title here</title>
</head>
<body> <h1>错误的视图</h1>
<h1>错误的error</h1> <!-- 查看struts框架在运行时期产生的所有错误信息 -->
<s:fielderror></s:fielderror>
</body>
</html>

3:代码方式验证Action中指定的方法(写验证方法命名规则,validate+要验证的方法名称,举例如下所示:);

 package com.bie.lesson10;

 import com.opensymphony.xwork2.ActionSupport;

 /**
* @author Author:别先生
* @date Date:2017年9月24日 下午3:28:25
*
* 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口;
*/
public class CheckAction extends ActionSupport{ /**
*
*/
private static final long serialVersionUID = 1L; //封装请求数据
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
} //重写数据校验的功能
/*@Override
public void validate() {
//用户名非空校验
if(user.getName() == null || "".equals(user.getName())){
//保存错误信息
super.addFieldError("name", "用户的账号不能为空。");
}
//密码非空校验
if(user.getPassword() == null || "".equals(user.getPassword())){
//保存错误信息
super.addFieldError("password", "用户的密码不能为空");
}
//用户的邮箱校验
if(user.getEmail() == null || "".equals(user.getEmail())){
//保存错误信息
super.addFieldError("email", "用户的邮箱不能为空");
}
//用户的生日不能为空
if(user.getBirthday() == null || "".equals(user.getBirthday())){
//保存错误信息
super.addFieldError("birthday" , "用户的生日不能为空");
} }*/ public void validatecheckData() {
//用户名非空校验
if(user.getName() == null || "".equals(user.getName())){
//保存错误信息
super.addFieldError("name", "用户的账号不能为空。");
}
//密码非空校验
if(user.getPassword() == null || "".equals(user.getPassword())){
//保存错误信息
super.addFieldError("password", "用户的密码不能为空");
}
//用户的邮箱校验
/*if(user.getEmail() == null || "".equals(user.getEmail())){
//保存错误信息
super.addFieldError("email", "用户的邮箱不能为空");
}*/
//用户的生日不能为空
/*if(user.getBirthday() == null || "".equals(user.getBirthday())){
//保存错误信息
super.addFieldError("birthday" , "用户的生日不能为空");
}*/ } //业务方法
public String checkData(){ System.out.println(user);
return SUCCESS;
} //用户列表的展示
public String list(){ System.out.println("模拟是否验证");
return "list";
} }

4:xml方式验证Action中所有的方法(代码验证比较繁琐,设计很多重复的验证逻辑,例如,非空验证,数值验证,email,日期等等,struts2对于常用的验证,进行了封装,即提供了验证器,验证指定额常用业务逻辑;);

  4.1:Struts提供的验证器:xwork-core-2.3.16.3.jar    ---》com.opensymphony.xwork2.validator.validators ---》default.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <!-- START SNIPPET: validators-default -->
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->

  4.2:如何写xml,从而定义验证规则:

    (a)xml文件名称语法:ActionClassName-validation.xml,注意,此xml需要与当前要验证的action在同一个目录;
    (b)举例:CheckXmlAction-validation.xml,找到xwork-core-2.3.16.3.jar/xwork-validator-1.0.3.dtd复制一下dtd的头文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
 package com.bie.lesson11;

 import com.opensymphony.xwork2.ActionSupport;

 /**
* @author Author:别先生
* @date Date:2017年9月24日 下午3:28:25
*
* 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口;
*/
public class CheckXmlAction extends ActionSupport{ /**
*
*/
private static final long serialVersionUID = 1L; //封装请求数据
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
} //业务方法
public String checkData(){ System.out.println(user);
return SUCCESS;
} /*//用户列表的展示
public String list(){ System.out.println("模拟是否验证");
return "list";
}*/ }

验证的xml配置,注意起名规则:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators> <!-- 验证的每一字段用field表示 -->
<field name="user.name">
<!-- 指定使用的验证器 -->
<field-validator type="requiredstring">
<!-- 验证失败的错误提示信息 -->
<message>用户名不能为空</message>
</field-validator>
</field> <!-- 验证的每一字段用field表示 -->
<field name="user.password">
<!-- 指定使用的验证器 -->
<field-validator type="requiredstring">
<!-- 验证失败的错误提示信息 -->
<message>密码不能为空</message>
</field-validator> <!-- 密码的长度校验 -->
<field-validator type="stringlength">
<param name="minLength"></param>
<param name="maxLength"></param>
<message>密码长度必须6-10位</message>
</field-validator>
</field> <!-- 验证日期和验证邮箱 -->
<field name="user.email">
<field-validator type="email">
<message>邮箱格式不正确</message>
</field-validator>
</field>
<field name="user.birthday">
<field-validator type="date">
<message>日期格式不正确</message>
</field-validator>
</field> </validators>

5:xml方式验证Action中指定的方法(与上面xml验证方式大致相同,验证xml文件内容不变);

  5.1:命名规则:语法,ActionClassName-ActionName-validation.xml,举例:CheckXmlAction-data_checkData-validation.xml即验证CheckXmlAction的checkData方法;

验证总结

代码验证:

重写validate()   ,  验证action所有方法

Validate方法名(),  验证指定“方法名”的方法

Xml:

验证所有方法: ActionClassName-validation.xml

验证指定方法: ActionClassName-actionName-validation.xml

代码验证:

比较灵活,可以满足所有的需求.

比较繁琐,要写重复的验证判断逻辑!

适合: 表单字段较少的情况用!

XML验证:

通用,但不够灵活; 可以验证特定简单的业务。

适合: 验证表单字段较多,可以大大简化代码!

(配置文件过多)

6:验证错误处理的三种方法,如果数据输入错误就依旧跳转到输入数据的界面,这点在struts.xml里面控制:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="checkXmlPackage" extends="struts-default">
<!-- 注册失败跳转到注册页面,显示失败信息 -->
<global-results>
<result name="input">/dataXmlCheck.jsp</result>
</global-results> <action name="data_*" class="com.bie.lesson11.CheckXmlAction" method="{1}">
<result name="success">/success2.jsp</result>
<!-- <result name="input">/error.jsp</result> -->
<!-- <result name="list">success2.jsp</result> -->
</action> </package> </struts>

然后在输入数据的页面进行错误提示:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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> <!-- 修改struts标签默认的样式: 不让换行 -->
<style type="text/css">
ul{display: inline;}
ul li{display: inline;color: red;}
</style> </head>
<body> <!-- 显示的是Struts2在运行时期产生的所有错误 -->
<!-- 方式一 -->
<%-- <s:fielderror></s:fielderror> --%> <%-- <s:fielderror fieldName="user.name"></s:fielderror>
<s:fielderror fieldName="user.password"></s:fielderror>
<s:fielderror fieldName="user.email"></s:fielderror>
<s:fielderror fieldName="user.birthday"></s:fielderror> --%> <form action="${pageContext.request.contextPath}/data_checkXmlData.action" method="post">
账号:<input type="text" name="user.name"/>
<!-- 方式二 -->
<s:fielderror fieldName="user.name"></s:fielderror><br/>
密码:<input type="password" name="user.password"/>
<s:fielderror fieldName="user.password"></s:fielderror><br/>
邮箱:<input type="text" name="user.email"/><br/>
<%-- <s:fielderror fieldName="user.email"></s:fielderror> --%>
生日:<input type="text" name="user.birthday"/><br/>
<%-- <s:fielderror fieldName="user.birthday"></s:fielderror> --%>
<input type="submit" value="注册"/>
<input type="reset" value="重置"/>
</form> </body>
</html>

方式三(fielderror.ftl文件):

方式3: 修改标签定义的模板

找到fielderror标签定义的模板文件:

Struts-core.jar\template\simple\ fielderror.ftl

把修改后的fielderror.ftl文件,放到src/ template/ simple/ fielderror.ftl

这样标签显示的样式就修改了!

<#--
/*
* $Id: fielderror.ftl 805635 2009-08-19 00:18:54Z musachy $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<#if fieldErrors??><#t/>
<#assign eKeys = fieldErrors.keySet()><#t/>
<#assign eKeysSize = eKeys.size()><#t/>
<#assign doneStartUlTag=false><#t/>
<#assign doneEndUlTag=false><#t/>
<#assign haveMatchedErrorField=false><#t/>
<#if (fieldErrorFieldNames?size > 0) ><#t/>
<#list fieldErrorFieldNames as fieldErrorFieldName><#t/>
<#list eKeys as eKey><#t/>
<#if (eKey = fieldErrorFieldName)><#t/>
<#assign haveMatchedErrorField=true><#t/>
<#assign eValue = fieldErrors[fieldErrorFieldName]><#t/>
<#if (haveMatchedErrorField && (!doneStartUlTag))><#t/>
<#assign doneStartUlTag=true><#t/>
</#if><#t/>
<#list eValue as eEachValue><#t/>
${eEachValue}
</#list><#t/>
</#if><#t/>
</#list><#t/>
</#list><#t/>
<#if (haveMatchedErrorField && (!doneEndUlTag))><#t/>
<#assign doneEndUlTag=true><#t/>
</#if><#t/>
<#else><#t/>
<#if (eKeysSize > 0)><#t/>
<ul<#rt/>
<#if parameters.cssClass??>
class="${parameters.cssClass?html}"<#rt/>
<#else>
class="errorMessage"<#rt/>
</#if>
<#if parameters.cssStyle??>
style="${parameters.cssStyle?html}"<#rt/>
</#if>
>
<#list eKeys as eKey><#t/>
<#assign eValue = fieldErrors[eKey]><#t/>
<#list eValue as eEachValue><#t/>
<li><span><#if parameters.escape>${eEachValue!?html}<#else>${eEachValue!}</#if></span></li>
</#list><#t/>
</#list><#t/>
</ul>
</#if><#t/>
</#if><#t/>
</#if><#t/>

7:staruts的表单主题样式修改(default学习.properties搜索theme,找到struts.ui.theme=xhtml默认样式,修改一下):

<!--对于struts标签默认的主题样式:default.xml/struts.ui.theme=xhtml
可以通过常量修改, 改为简单主题:-->
<constant name="struts.ui.theme" value="simple"></constant>

8:Struts2中常用的几个技术:数据回显,模型驱动,防止表单重复提交的应用。

(1):Struts2的数据回显技术必须使用Struts2的标签。

《手动通过value设置显示的值value="%{#request.user.name}"这个格式是通过ognl表达式进行显示数据的》。

(2):数据回显技术,通过值栈存放,然后直接通过页面的name属性进行取值<s:textfield name="userName"></textfield>,如:

  ActionContext ac = ActionContext.getContext();
  ValueStack vs = ac.getValueStack();
  //vs.pop();//移除栈顶元素
  vs.push("user");//将user对象存放到值栈里面

9:综合应用:

第一步:创建数据库和数据表,这里使用mysql默认的数据库test,创建数据表如下所示:

-- 创建数据表
CREATE TABLE employee(
employeeId INT PRIMARY KEY AUTO_INCREMENT,
employeeName VARCHAR(),
employeeTime DATE
)

第二步:搭建Struts的环境(导包,配置web.xml和c3p0的配置,):

导包,包含struts的包和mysql的包还有c3p0的包:

c3p0-0.9.1.2.jar
commons-dbutils-1.6.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
jstl-1.2.jar
mysql-connector-java-5.1.12-bin.jar
ognl-3.0.6.jar
struts2-core-2.3.16.3.jar
xwork-core-2.3.16.3.jar

<c3p0-config>

    <!-- c3p0默认配置,下面还可以配置多个数据库 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password"></property>
<property name="initialPoolSize"></property>
<property name="maxPoolSize"></property>
<property name="maxIdleTime"></property>
</default-config> </c3p0-config>

配置一下web.xml文件:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>struts</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!-- struts2的核心过滤器 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

配置一下Struts的总配置文件struts.xml文件:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!-- struts在允许的时候会加载这个总配置文件:src/struts.xml --> <!-- 全局配置 -->
<!-- 修改Struts的默认访问后缀 -->
<!-- <constant name="struts.action.extension" value="action,do,struts,"></constant> -->
<!-- <include file="constant.xml"></include> --> <!-- 在总配置文件中引入其他所有的配置文件 --> <!-- <include file="com/bie/lesson01/helloStruts.xml"></include> --> <include file="com/bie/lesson02/strutsTest.xml"></include> </struts>

第三步:弄一下连接数据库的操作:

 package com.bie.lesson02.utils;

 import java.sql.Connection;
import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import com.mchange.v2.c3p0.ComboPooledDataSource; /***
* 数据库连接工具类
* @author 别先生
*
*/
public class BaseUtils { //初始化c3p0
private static DataSource dataSource = null; //自动加载src目录下面的c3p0配置文件。c3p0-config.xml
static{
dataSource = new ComboPooledDataSource();
} public static QueryRunner getQueryRunner(){
//第一步:创建QueryRunner对象,传入连接池对象
//在创建QueryRunner对象的时候,如果传入数据对象dataSource,
//那么在使用QueryRunner对象的方法时候,就不需要传入连接对象
QueryRunner query=new QueryRunner(dataSource);
//第二步:会自动从数据源中获取连接(不用关闭连接)
return query;
} //测试一下是否连接通数据库
/*public static void main(String[] args) {
QueryRunner qr = getQueryRunner();
DataSource ds = qr.getDataSource();
try {
Connection conn = ds.getConnection();
System.out.println("连接数据库成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }*/
}

第四步:开始开发dao层,这里使用接口和实现接口的方式来开发:

 package com.bie.lesson02.dao;

 import java.util.List;

 import com.bie.lesson02.po.Employee;

 public interface EmployeeDao {

     //查询所有的员工信息
List<Employee> getALL(); //根据员工编号进行查询操作
Employee getById(int employeeId); //添加员工信息
void save(Employee employee); //修改员工信息
void update(Employee employee);
}
 package com.bie.lesson02.dao.impl;

 import java.sql.SQLException;
import java.util.List; import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler; import com.bie.lesson02.dao.EmployeeDao;
import com.bie.lesson02.po.Employee;
import com.bie.lesson02.utils.BaseUtils; public class EmployeeDaoImpl implements EmployeeDao{ @Override
public List<Employee> getALL() { //查询的sql语句
String sql = " select * from employee ";
try {
return BaseUtils.getQueryRunner().query(sql, new BeanListHandler<Employee>(Employee.class));
} catch (SQLException e) {
throw new RuntimeException();
}
} @Override
public Employee getById(int employeeId) {
//根据员工的编号进行查询
String sql ="select * from employee where employeeId = ? ";
//问号?这个参数传到后面,切记传参数
try {
return BaseUtils.getQueryRunner().query(sql, new BeanHandler<Employee>(Employee.class),employeeId);
} catch (SQLException e) {
throw new RuntimeException();
}
} @Override
public void save(Employee employee) {
//保存员工的信息,即插入操作
String sql = " insert into employee(employeeName,employeeTime) values(?,?)"; //使用c3p0的插入操作
try {
BaseUtils.getQueryRunner().update(sql, employee.getEmployeeName(),employee.getEmployeeTime());
} catch (SQLException e) {
throw new RuntimeException();
}
} @Override
public void update(Employee employee) {
//修改操作
String sql = "update employee set employeeName =?,employeeTime=? where employeeId =? "; try {
BaseUtils.getQueryRunner().update(sql, employee.getEmployeeName(),employee.getEmployeeTime(),employee.getEmployeeId());
} catch (SQLException e) {
throw new RuntimeException();
}
} }

第五步:开始开发service层,这里使用接口和实现接口的方式来开发:

 package com.bie.lesson02.service;

 import java.util.List;

 import com.bie.lesson02.po.Employee;

 public interface EmployeeService {

     //查询所有的员工信息
List<Employee> getALL(); //根据员工编号进行查询操作
Employee getById(int employeeId); //添加员工信息
void save(Employee employee); //修改员工信息
void update(Employee employee);
}
 package com.bie.lesson02.service.impl;

 import java.util.List;

 import com.bie.lesson02.dao.EmployeeDao;
import com.bie.lesson02.dao.impl.EmployeeDaoImpl;
import com.bie.lesson02.po.Employee;
import com.bie.lesson02.service.EmployeeService; public class EmployeeServiceImpl implements EmployeeService{ private EmployeeDao dao = new EmployeeDaoImpl(); @Override
public List<Employee> getALL() { return dao.getALL();
} @Override
public Employee getById(int employeeId) {
if(employeeId != ){
return dao.getById(employeeId);
} return null;
} @Override
public void save(Employee employee) {
if(employee != null){
dao.save(employee);
} } @Override
public void update(Employee employee) {
if(employee != null){
dao.update(employee);
} } }

第六步:以上全部搞完,基本只剩下使用Struts进行Action的开发,以及页面的书写:

  

一脸懵逼学习Struts数据校验以及数据回显,模型驱动,防止表单重复提交的应用。的更多相关文章

  1. Struts(二十七):使用token或tokenSession防止表单重复提交

    什么是表单重复提交 表单重复提交包括以下几种情况: 前提:不刷新表单页面 1.多次点击“提交”按钮后,重复提交了多次: 2.已经提交成功之后,按“回退”按钮之后,在点击“提交”按钮后,提交成功: 3. ...

  2. struts2视频学习笔记 29-30(Struts 2常用标签,防止表单重复提交)

    课时28 Struts 2常用标签解说 property标签 property标签用于输出指定值: <s:set name="name" value="'kk'&q ...

  3. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

    1. struts 工作流程图 超链接 2. 入门案例 struts入门案例: 1.写一个注册页面,把请求交给 struts处理 <form action="${pageContext ...

  4. [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交

    如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...

  6. Struts防止表单重复提交

    1.什么是表单重复提交 > 在不刷新表单页面的前提下:         >> 多次点击提交按钮        >> 已经提交成功, 按 "回退" 之后 ...

  7. spring boot 学习(七)小工具篇:表单重复提交

    注解 + 拦截器:解决表单重复提交 前言 学习 Spring Boot 中,我想将我在项目中添加几个我在 SpringMVC 框架中常用的工具类(主要都是涉及到 Spring AOP 部分知识).比如 ...

  8. Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  9. java web学习总结(十三) -------------------使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

随机推荐

  1. R-FCN论文讲解(转载链接)

    总结一下一下R-FCN的思想:由于分类网络具有位置的“不敏感性”和检测网络具有“位置的敏感性”这两者之间的矛盾, 而ResNet论文中为了解决这个问题,做出了一点让步,即将RoI Pooling层不再 ...

  2. 解决ubuntu的gedit编辑器中文乱码的问题

    hello,本人 sky 又和大家见面了很多人在使用ubuntu系统时发现打开windows系统下面写的文档的话会发现乱码,是因为编码格式的问题windows系统下面是用GB2312等编码格式进行中文 ...

  3. HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改

    题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...

  4. RS485 通信接收时丢失0x11等数据

    RS485通信接收方,丢弃掉了值为 0x11 的数据. 怀疑 0x11 被转义,没有按照原始数据接收, 查看ASCII码对应表 0x11 代表 “本文结束”, 因此丢弃是有可能的. 要想接收原始数据而 ...

  5. localtime函数和strftime函数

    localtime函数 功能: 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间,而gmtime函数转换后的时间没有经过时区变换,是UTC时间 . 用法: #include & ...

  6. ansible笔记(8):常用模块之系统类模块(二)

    ansible笔记():常用模块之系统类模块(二) user模块 user模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 此处我们介绍一些user模块 ...

  7. 通过zabbix自带api进行主机的批量添加操作

    通过zabbix自带api进行批量添加主机 我们需要监控一台服务器的时候,当客户端装好zabbix-agent端并正确配置以后,需要在zabbix-server的web gui界面进行添加zabbix ...

  8. Ex3_2 最近点对

    原文链接http://blog.csdn.net/zyang008/article/details/6175587 分治法 1)算法描述:已知集合S中有n个点,分治法的思想就是将S进行拆分,分为2部分 ...

  9. appium常用方法

    1.输入中文 在capabilities中增加两项设置: capabilities.setCapability("unicodeKeyboard", "True" ...

  10. python-基于UDP通信的套接字,socketserver模块的使用

    一.基于UDP协议通信的套接字 udp是没有链接的,所以先启动哪一端都不会报错 import socket server=socket.socket(socket.AF_INET,socket.SOC ...