0
点赞
收藏
分享

微信扫一扫

【Java15】maven(安装,管理,插件),旅游项目(校验,提交)

是归人不是过客 2022-04-04 阅读 79

文章目录


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&amp;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() {
    }
}

在这里插入图片描述

举报

相关推荐

0 条评论