文章目录
- 1.maven安装和创建项目:settings.xml,web.xml
- 2.管理:以前在WEB-INF右击new一个lib文件夹,现在不用,只需写dependency标签就行
- 3.插件:maven的jdk是1.5,所以maven要扩展功能jdk1.8即插件
- 4.旅游项目环境塔建:选中数据库右击运行sql文件
- 5.注册/提交功能:局部刷新主要应用于失败的情况,不跳转
1.maven安装和创建项目:settings.xml,web.xml
如下在A1中只要说引入什么jar包就行。apache-maven-3.6.1解压到F/develop文件夹下,将原来 < localRepository > 和< mirrors >传智内网都注释掉,不能存在两个一样的标签。
如下IDEA关联本地maven(maven本身就是Java程序):-DarchetypeCatalog=internal ,如下配置好后对当前项目不生效需重新File-New-Project-maven。
如下是maven配置环境变量。
如下Maven解压包里boot文件夹里是一个。。.jar,所以maven主要代码是java写的,所以保证jdk要装。
私服就是如阿里网速快把maven官方仓库下载下来,别人到阿里这里下载。resources文件夹
里放c3p0-config.xml等,test包下的类必须以XxTest结尾
,只有main文件夹里代码才会被打包。
1.1 maven管理的web工程
如下将上面java工程变为web工程,红框一行不写,默认为jar包,所以在java工程中没有写这一行。加上如下红框一行,mvn package会打成war包。
如上一步可以View-Toolbar产生如下图标再点击,效果同上。
点击如下右边绿色+号(最右边红色框出,不是中间的绿色+号)设置web.xml。
如上蓝色横线(不是蓝色阴影)路径不对,替换如下。
如上最后点apply再点ok。如下webapp文件夹不能手动创建。
如下第三步配置tomcat。
如下图点击Fix,使新建的tomcat联系本工程,最后点apply再点ok。最后在webapp文件夹下新建index.html中body标签里写hello,点击乌龟运行,自动跳出网页显示hello,说明已经成功。
2.管理:以前在WEB-INF右击new一个lib文件夹,现在不用,只需写dependency标签就行
如下选中右击show in Explorer打开文件夹,地址栏输入cmd。
新创建出的工程没有target文件夹(整个项目编译后即mvn compile产出target路径,或点击小乌龟后产生,小乌龟做的事是编译,测试,运行,并没有发布,发布需手动)。mvn命令在第一章已配过环境变量。mvn test只运行test文件夹里代码,编译还是整个项目,test在compile后面,前面的会自动执行。
mvn package在target文件夹里多出maven-web2-1.0.0.war包(打成包,给tomcat运行)。如下在pom.xml(相当于maven项目的makefile)中:
如下粉字运行
就是tomcat运行,直接去maven仓库读上图的war包。
从远程仓库中获取坐标:1. 中央仓库 : http://mvnrepository.com/ 。2. 私服: 阿里云: https://maven.aliyun.com/mvn/search。进入前面两个网站搜索并进行复制,groupId是com.。如下alt+insert是在本地仓库搜索依赖。
// pom.xml(web.xml配置url和类的映射关系),修改了都要import changes。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--schema约束下面内容的编写-->
<!--
pom : project object model项目对象模型 描述整个项目 (class对象描述.class文件,Bom对象描述浏览器)
modelVersion : pom的版本
坐标: groupId + artifactId + version (maven是通过 坐标 来唯一识别项目: jar/war)
-->
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima.webdemo</groupId>
<artifactId>maven-web2</artifactId>
<version>1.0.0</version>
<packaging>war</packaging> <!-- 打包方式: war包 (默认jar包) -->
<!--11111111111111111111111111111111111111111111111111111111111111111111111111111111-->
<!--依赖:dependencies:多个dependency 。版本统一管理 : properties,版本会变-->
<properties>
<c3p0.version>0.9.1.2</c3p0.version>
<beanutils.version>1.8.3</beanutils.version>
<commons.logging.version>1.1.1</commons.logging.version>
<fastjson.version>1.2.47</fastjson.version>
<servlet.version>3.0.1</servlet.version>
<jstl.version>1.2</jstl.version>
<mysql.connector.version>5.1.18</mysql.connector.version>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
<dependency> <!--通过如下坐标,可在本地repository/junit/junit/..找到.jar文件-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--c3p0-->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<!--commons-beanutils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${beanutils.version}</version>
</dependency>
<!--commons-logging-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons.logging.version}</version>
</dependency>
<!--fastjson:: java对象-> json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--Jackson required包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.1</version>
</dependency>
<!--servlet3-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!--jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!--mysql驱动:jdbc技术必须要的-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.version}</version>
<scope>runtime</scope>
</dependency>
<!--spring-jdbctemplate-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
<!--1111111111111111111111111111111111111111111111111111111111111111111111111111111-->
<build>
<plugins>
<!--JDK编译插件,不论java工程还是web工程都要配置,不然maven默认jdk1.5编译和运行-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration> <!--配jdk版本-->
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--test插件,防乱码-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<forkMode>once</forkMode>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
<!-- tomcat7插件,端口设为80不是8080,因为http协议80端口不用写 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.1 依赖作用范围:test代码没意义,不需打包。默认< scope > compile < /scope >不写出来
如下java文件夹中用到@test会报错。
< dependencies > 中alt+insert
搜javax.servlet 3.0以上才支持注解,以前在web项目里可直接用servlet,没有导包这回事,因为以前创建Java Enterprise时已指定tomcat(servlet在本地的tomcat解压包中的/lib/servlet-api.jar)
。现在是创建maven项目没指定tomcat(后来才配置tomcat,servlet是接口,其实现由tomcat提供)。
tomcat只起到运行作用(因为web工程入口是tomcat的main方法),maven只是一个管理工具,如果我们自己导入的servlet api存活到运行时期,有可能和tomcat里servlet api版本不同产生冲突。
如果不导jdbc驱动:编译不会报错(因为 " " 写的是字符串,解耦了),运行会报错(找不到这个类)。system是本地绝对路径,但是发布时不能用绝对路径,所以system不看。
3.插件:maven的jdk是1.5,所以maven要扩展功能jdk1.8即插件
平时在idea中右击运行或点击乌龟运行是tomcat运行(utf8)。点击右边maven插件的test功能
,运行乱码,因为变成了maven运行,不是utf8了。所以在pom.xml加test插件,防乱码。
用maven的tomcat插件(像小程序)也可以让tomcat运行我们的程序(这样不需要装tomcat),pom.xml写好tomcat7依赖后,还需要按如下操作。
点击如下绿色+号,选择Maven。
如下换成tomcat7后再点乌龟运行。
如下用插件的tomcat(80端口可省略),不用插件的tomcat用8080。
3.1 Update依赖索引:解决在idea中pom.xml按alt+insert搜索找不到
由于网络的原因,jar包下载不完全,这些不完整的jar包都是以lastUpdated结尾。此时,maven不会再重新帮你下载,需要你删除这些以lastUpdated结尾的文件。
如果本地仓库中有很多这样的以lastUpadted结尾的文件,可以执行如下脚本来删除,如下是如上clean…bat文件,第一行路径不要加双引号。
set REPOSITORY_PATH=E:\javaDevlopment\maven\health_repository
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
rem 搜索完毕
pause
4.旅游项目环境塔建:选中数据库右击运行sql文件
//c3p0-config.xml
<c3p0-config>
<default-config>
<!-- 数据库的连接参数 ,加上? useUnicode= 防止不是utf-8-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/heima_travel89? useUnicode=true&characterEncoding=UTF8</property>
<property name="user">root</property>
<property name="password">1234</property>
</default-config>
</c3p0-config>
5.注册/提交功能:局部刷新主要应用于失败的情况,不跳转
如下左右对应颜色相同:非空和3-6等是前端校验。后端校验也用jquary-validator(里面支持ajax请求)。status和code是数据表中两个字段。
如下可快速查看源码。
5.1 前端:register.html,commons.js
//register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>注册</title>
<link rel="stylesheet" type="text/css" href="css/common.css">
<link rel="stylesheet" href="css/register.css">
<script src="js/jquery-3.3.1.js"></script> <!--导入jquery-->
<script src="js/jquery.validate.js"></script> <!--TODO: 插件在jquery之后-->
<script src="js/commons.js"></script>
<!--1111111111111111111111111111111111111111111111111111111111111111111111111111111111111-->
<script>
$(function () { // 页面加载事件
$("#registerForm").validate({ //.validate方法基于onsubmit事件, 校验不通过: return false,如下rules加双引号,那下面就是json
rules:{ //如下表单项name值:校验规则
"username" : {
required:true
},
"password" : {
rangelength:[3,7] //jquery.validate.js里定义的rangelength方法
},
"telephone" : {
phoneFmt : true //commons.js里定义的phoneFmt方法
},
"email" : {
//上面3个都是前端校验,这个email是后端校验(不需要写ajax,底层就是ajax)
//参数: 默认提交当前email输入框中的value
//回调: 规定服务器只能响应 true/false
remote : "/CheckEmailServlet"
}
},
messages:{
"username" : "用户名必须输入",
"password" : "密码长度必须介于{0}到{1}之间",
"email" : "email已经被注册了,请换一个"
},
/*
* 提交处理器: 只有表单校验全都通过,才有可能执行 (基于表单提交按钮的点击事件)
* form : 表示是整个表单对象,就是上面$("#registerForm")
* */
submitHandler : function (form) {
//表单中的所有数据都序列化成 n1=v1&n2=v2... 反射拿到action属性,但找不到user.setaction方法,不会设置进去 //"action=register&username=admin&password=123&email=120%40qq.com&name=&telephone=13800138000&sex=%E7%94%B7&birthday=&check="
var param = $(form).serialize(); //结果如上行 //点提交按钮,表单会自动序列化放在地址栏中,即同步事件序列化是自动完成的。异步需要.serialize。
$.post("/RegisterServlet",param,function (result) {
console.log(result) //{msg: ..}
if(result.flag){
location.href = "/register_ok.html"
}else{
$("#msg").html(result.msg) //局部刷新,不跳转
}
},"json")
}
})
})
</script>
</head>
<!--111111111111111111111111111111111111111111111111111111111111111111111111111111111111-->
<body>
<!--引入头部-->
<div id="header"></div>
<!-- 头部 end -->
<div class="rg_layout">
<div class="rg_form clearfix">
<div class="rg_form_left">
<p>新用户注册</p>
<p>USER REGISTER</p>
</div>
<div class="rg_form_center">
<!--注册表单-->
<form id="registerForm">
<!--提交处理请求的标识符-->
<input type="hidden" name="action" value="register">
<table style="margin-top: 25px;">
<tr>
<td class="td_left">
<label for="username">用户名</label>
</td>
<td class="td_right">
<input type="text" id="username" name="username" placeholder="请输入账号">
</td>
</tr>
<tr>
<td class="td_left">
<label for="password">密码</label>
</td>
<td class="td_right">
<input type="password" id="password" name="password" placeholder="请输入密码">
</td>
</tr>
<tr>
<td class="td_left">
<label for="email">Email</label>
</td>
<td class="td_right">
<input type="text" id="email" name="email" placeholder="请输入Email">
<label id="email-error" class="error" for="email"></label>
</td>
</tr>
<tr>
<td class="td_left">
<label for="name">姓名</label>
</td>
<td class="td_right">
<input type="text" id="name" name="name" placeholder="请输入真实姓名">
</td>
</tr>
<tr>
<td class="td_left">
<label for="telephone">手机号</label>
</td>
<td class="td_right">
<input type="text" id="telephone" name="telephone" placeholder="请输入您的手机号">
</td>
</tr>
<tr>
<td class="td_left">
<label for="sex">性别</label>
</td>
<td class="td_right gender">
<input type="radio" id="sex" name="sex" value="男" checked> 男
<input type="radio" name="sex" value="女"> 女
</td>
</tr>
<tr>
<td class="td_left">
<label for="birthday">出生日期</label>
</td>
<td class="td_right">
<input type="date" id="birthday" name="birthday" placeholder="年/月/日">
</td>
</tr>
<tr>
<td class="td_left">
<label for="check">验证码</label>
</td>
<td class="td_right check">
<input type="text" id="check" name="check" class="check">
<img src="checkCodeServlet" height="32px" alt="" onclick="changeCheckCode(this)">
<script type="text/javascript">
//图片点击事件
function changeCheckCode(img) {
img.src="checkCodeServlet?"+new Date().getTime();
}
</script>
</td>
</tr>
<tr>
<td class="td_left">
</td>
<td class="td_right check">
<input type="submit" class="submit" value="注册">
<span id="msg" style="color: red;"></span>
</td>
</tr>
</table>
</form>
</div>
<div class="rg_form_right">
<p>
已有账号?
<a href="#">立即登录</a>
</p>
</div>
</div>
</div>
<!--引入尾部-->
<div id="footer"></div>
<!--导入布局js,共享header和footer-->
<script type="text/javascript" src="js/include.js"></script>
<script>
</script>
</body>
</html>
//commons.js
//自定义校验规则:phoneFmt。使用步骤:$.validator.addMethod()
/*
* $.validator(rulename,fn,msg)
* 1、 rulename:校验规则的名称
* 2、 fn:实现具体校验逻辑的方法
* 3、msg:设置校验不通过时的错误提示信息
* */
$.validator.addMethod("phoneFmt",function (value,element,param) {
/*
* 1、value:获取用户在被校验的标签中输入的value值;
* 2、element:被校验的标签的对象
* 3、param:使用校验规则时,传入的值
* */
//书写校验逻辑
console.log(value+" "+element+" "+ param);
if(param) {
//对手机号合法性校验:正则
//1、创建正则对象:
/*
* 方式一: new RegExp(" 正则 ")
* 方式二: 字面量 /正则表达式/
* */
// var phoneReg = new RegExp("^1[3456789]\\d{9}$");
// var phoneCheckFlag = phoneReg.test(value);
//
// if(phoneCheckFlag){
// //手机号合法:return true
// return true;
// }
return new RegExp("^1[3456789]\\d{9}$").test(value);
}
},"手机号不合法!");
如下jquary validate异步验证,底层就是上面的ajax,远程地址只能输出true或false,不能有其他输出。
如下改为post,到数据库查看插入的中文记录没有乱码,因为common文件夹下的CharchaterFilter.java对全站post请求拦截,响应乱码也解决了。
5.2 web:CheckEmailServlet.java,RegisterServlet.java
package com.heima.travel.web;
import com.heima.travel.service.UserService;
import com.heima.travel.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/CheckEmailServlet")
public class CheckEmailServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String email = request.getParameter("email");
UserService service = new UserServiceImpl(); //UserService是接口,面向接口编程
boolean result = service.checkEmail(email);
// System.out.println("CheckEmailServlet:" + result);
response.getWriter().print(result); //按照前端的需求: 必须响应true/false
}
}
package com.heima.travel.web;
import com.heima.travel.bean.User;
import com.heima.travel.service.UserService;
import com.heima.travel.service.impl.UserServiceImpl;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet(urlPatterns = "/RegisterServlet")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String[]> map = request.getParameterMap();
User user = new User();
try {
//提交的参数的name如果在javabean没有,那就不会设置进去
//form表单项的name值要跟javabean的属性名一致!!!
BeanUtils.populate(user,map);
} catch (Exception e) {
e.printStackTrace();
}
UserService service = new UserServiceImpl();
String json = service.registerUser(user);
response.getWriter().print(json);
}
}
5.3 service:UserService.java,UserServiceImpl.java
package com.heima.travel.service;
import com.heima.travel.bean.User;
public interface UserService {
boolean checkEmail(String email); //校验email唯一性
String registerUser(User user); //注册用户
boolean active(String code); //激活用户
String isEmailActive(String email);
User checkUser(String email, String password);
}
package com.heima.travel.service.impl;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.heima.travel.bean.User;
import com.heima.travel.dao.UserDao;
import com.heima.travel.dao.impl.UserDaoImpl;
import com.heima.travel.service.UserService;
import com.heima.travel.utils.Md5Util;
import com.heima.travel.utils.UuidUtil;
import java.util.HashMap;
import java.util.UUID;
public class UserServiceImpl implements UserService {
UserDao dao = new UserDaoImpl();
@Override
public String registerUser(User user) {
/*
* status : 激活状态 0代表未激活
* code : 激活码(uuid)
* password : 加密
* */
user.setStatus(0);
user.setCode(UuidUtil.getUuid());
try {
String md5 = Md5Util.encodeByMd5(user.getPassword());
user.setPassword(md5);
} catch (Exception e) {
e.printStackTrace();
}
int count = dao.addUser(user); //count是增删改返回的影响的函数
HashMap<String, Object> map = new HashMap<>();
map.put("flag",count!=0); // flag = true/false
if(count==0){
map.put("msg","服务器正在维护,注册失败");
}
//JackSon jar包: 有异常,不好用,用下面FastJson
// ObjectMapper om = new ObjectMapper();
// String json = om.writeValueAsString(map);
//FastJson jar包 //.toJSONString是静态方法,上面JackSon要new 对象
String json = JSON.toJSONString(map); //因为要返回json,所以用map存
return json;
}
@Override
public boolean active(String code) {
int count = dao.updateStatusByCode(code);
return count != 0;
}
@Override
public String isEmailActive(String email) {
User user = dao.findUserByEmailAndStatus(email);
HashMap<String, Object> map = new HashMap<>();
map.put("flag",user!=null);
return JSON.toJSONString(map);
}
@Override
public User checkUser(String email, String password) {
//登录: 明文->密文
try {
String cipherText = Md5Util.encodeByMd5(password);
User user = dao.findUserByEmailAndPassword(email,cipherText);
return user;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public boolean checkEmail(String email) {
User user = dao.findUserByEmail(email);
// if(user != null){
// return false;
// }
// return true; //查不到为true,前端可以注册
return user == null; //等同上面4行
}
}
如下password函数(sha算法),每次密文固定。
加密算法唯一破解方式:穷举法。尽量一个明文对应一个密文。告诉密文,生成不了明文,能生成相同密文。
如下md5函数,密文结果如上202c…
5.4 dao:UserDao.java,UserDaoImpl.java
package com.heima.travel.dao;
import com.heima.travel.bean.User;
public interface UserDao {
User findUserByEmail(String email);
int addUser(User user);
int updateStatusByCode(String code);
User findUserByEmailAndStatus(String email);
User findUserByEmailAndPassword(String email, String password);
}
package com.heima.travel.dao.impl;
import com.heima.travel.bean.User;
import com.heima.travel.dao.UserDao;
import com.heima.travel.utils.C3p0Utils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
public class UserDaoImpl implements UserDao {
JdbcTemplate template = C3p0Utils.getTemplate();
@Override
public int addUser(User user) {
String sql = "insert into tab_user values(null,?,?,?,?,?,?,?,?,?)";
int count = 0;
try {
count = template.update(sql,
user.getUsername(),
user.getPassword(),
user.getName(),
user.getBirthday(),
user.getSex(),
user.getTelephone(),
user.getEmail(),
user.getStatus(),
user.getCode());
} catch (DataAccessException e) {
}
return count;
}
@Override
public int updateStatusByCode(String code) {
String sql = "update tab_user set status = 1 where code = ?";
int update = template.update(sql, code);
return update;
}
@Override
public User findUserByEmailAndStatus(String email) {
String sql = "select * from tab_user where email = ? and status = 1";
User user = null;
try {
user = template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), email);
} catch (DataAccessException e) {
// e.printStackTrace();
}
return user;
}
@Override
public User findUserByEmailAndPassword(String email, String password) {
String sql = "select * from tab_user where email = ? and password = ? and status = 1";
User user = null;
try {
user = template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), email,password);
} catch (DataAccessException e) {
// e.printStackTrace();
}
return user;
}
@Override
public User findUserByEmail(String email) {
String sql = "select * from tab_user where email = ?";
User user = null;
try {
user = template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), email);
} catch (DataAccessException e) {
// e.printStackTrace(); // 打印造成服务器延迟
}
return user;
}
}
5.5 utils:C3p0Utils.java
package com.heima.travel.utils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class C3p0Utils { //数据源的工具类
private static ComboPooledDataSource ds = new ComboPooledDataSource(); //私有静态数据源成员变量
public static DataSource getDataSource() { //公有的得到数据源的方法
return ds;
}
public static JdbcTemplate getTemplate(){
return new JdbcTemplate(ds);
}
public static Connection getConnection() { //得到连接对象的方法
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection conn, Statement stmt, ResultSet rs) { //释放资源的方法
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);
}
public static void main(String[] args) {
System.out.println(getConnection());
}
}
5.6 common:CharchaterFilter.java
package com.heima.travel.common;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 解决全站乱码问题,处理所有的请求:1. post请求乱码。 2. 响应中文乱码
@WebFilter("/*")
public class CharchaterFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {
//将父接口转为子接口
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) rep;
//获取请求方法
String method = request.getMethod();
//解决post请求中文数据乱码问题
if(method.equalsIgnoreCase("post")){
request.setCharacterEncoding("utf-8");
}
//处理响应乱码
response.setContentType("text/html;charset=utf-8");
filterChain.doFilter(request,response);
}
public void destroy() {
}
}