一脸懵逼学习Struts数据校验以及数据回显,模型驱动,防止表单重复提交的应用。
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数据校验以及数据回显,模型驱动,防止表单重复提交的应用。的更多相关文章
- Struts(二十七):使用token或tokenSession防止表单重复提交
什么是表单重复提交 表单重复提交包括以下几种情况: 前提:不刷新表单页面 1.多次点击“提交”按钮后,重复提交了多次: 2.已经提交成功之后,按“回退”按钮之后,在点击“提交”按钮后,提交成功: 3. ...
- struts2视频学习笔记 29-30(Struts 2常用标签,防止表单重复提交)
课时28 Struts 2常用标签解说 property标签 property标签用于输出指定值: <s:set name="name" value="'kk'&q ...
- JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体
1. struts 工作流程图 超链接 2. 入门案例 struts入门案例: 1.写一个注册页面,把请求交给 struts处理 <form action="${pageContext ...
- [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交
如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...
- Struts防止表单重复提交
1.什么是表单重复提交 > 在不刷新表单页面的前提下: >> 多次点击提交按钮 >> 已经提交成功, 按 "回退" 之后 ...
- spring boot 学习(七)小工具篇:表单重复提交
注解 + 拦截器:解决表单重复提交 前言 学习 Spring Boot 中,我想将我在项目中添加几个我在 SpringMVC 框架中常用的工具类(主要都是涉及到 Spring AOP 部分知识).比如 ...
- Spring Boot (一) 校验表单重复提交
一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...
- java web学习总结(十三) -------------------使用Session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...
随机推荐
- Fusebox 类似WEBPACK 的工具,React Studio
Fusebox 类似WEBPACK 的工具, http://fuse-box.org/ React Studio: https://hackernoon.com/@reactstudio
- thinkphp验证码不显示
1.安装php的GD库 yum -y install php-gd 2.在输出图片前header("content-type: image/png"); 写入 header(&qu ...
- ffmpeg h264 encdoer 速度对比
h264_qsv frame= 250 fps=0.0 q=-0.0 Lsize= 1401kB time=00:00:10.00 bitrate=1146.8kbits/s speed= 14x l ...
- nginx配置文件注释说明
#定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...
- Sq lServer触发器的使用
创建表: CREATE TABLE [dbo].[GeneralRule]( [ID] [int] NOT NULL, ) NULL, [DeleteFlag] [int] NOT NULL ) CR ...
- HBase基础架构及原理
1. HBase框架简单介绍 HBase是一个分布式的.面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.HBas ...
- appium+java(四)微信公众号自动化测试实践
前言 随着手机阅读的普遍应用,微信公众号阅读,更为普遍,微信和qq一样,都是基于腾讯自研X5内核,不是google原生webview(其实就是进行了二次定制).实质上也是混合应用的一种,现在很多app ...
- [PHP]命名空间的一些要点
1.命名空间前不能接"\": namespace MyProject\Sub\Level; // it's right; namespace \MyProject\Sub\Leve ...
- 数据库-mysql-DDL-表记录操作
- GZip、deflate和sdch压缩(网摘整理)
GZip和deflate: gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分:deflate是一种压缩算法,是huffman编码的一种加强. deflate与gzip解压的代 ...