JavaWeb3

第一章

java是一门面向对象的编程语言,主要特点是:垃圾回收机制,可以跨平台运行等。
Java的三大特征分别是:封装,继承,多态。

其中Java分为三大体系结构:
A.JavaSE    :  Java的核心基础版,属于Java的核心,例如基本数据类型,String,线程技术等。
B.JavaEE    :  Java的Web服务版,属于Web项目的核心,主要负责搭建网站。
C.JavaME    :  Java的嵌入式版,属于嵌入式的核心,主要负责电子遥控相关产品。(非重点)
不管是JavaEE还是JavaME都是建立在JavaSE的基础之上。

互联网的产品一般分为两大架构,分别是B/S架构和C/S架构。
1. B/S架构:全称为Browser/Server,即浏览器/服务器结构。
主要是做网页端程序设计,只需要安装浏览器即可使用。(我们的主要学习任务)
2. C/S架构:全称为Client/Server,即客户端/服务器架构。
主要是做应用程序设计,需要下载客户端才可以使用。

不管是什么架构,本质都可以利用Java实现,所以不要看C/S架构比B/S架构普遍,就不想学习B/S架构。
B/S架构也是C/S架构的基础。

总结:未来我们都是使用JavaEE技术来实现B/S架构的项目。


服务器:
服务器的本质就是一台电脑。
所有的电脑都可以作为服务器存在。
例如:一个项目在谁的电脑上运行。那么,那台电脑就成了一台服务器。但是那台电脑如果关机了,蓝屏了,
就会导致别的用户无法正常访问那个项目。   就称之为“服务器炸了”。

一般来说:一台好的服务器的配置比一般电脑的配置要高很多很多。


如果想利用JavaWeb制作一个网站供客户使用就必须要服务器的支持。


Tomcat服务器是一种运行在服务器(电脑)上的软件,其主要功能是用来提供Web服务

Tomcat是Apache基金会的一个核心项目。
(和Java属于同一个公司)

目前tomcat9.0是最稳定最常用的版本。

只要你的电脑成功安装了JDK,tomcat即可使用。
tomcat默认端口号为8080。(mysql默认端口号3306)


如何利用idea创建一个web项目:
1.创建一个基本的普通项目
2.选中这个项目,右键选择add Framework 然后勾选Web Application 选择默认的版本4.0
(注意:idea的版本不同,步骤会有略微的不同)
3.此时就已经创建好了。新的目录简介如下:

src:放java源代码的地方
web:放前台页面的地方(HTML)  初学者常犯的错误:经常把html页面放在web目录下得WEB-INF目录
WEB-INF: web项目的安全目录(用户无法访问的地方。暂做了解)
web.xml: web项目的起点(并不是意味着从这里启动。)    例如设置网址的欢迎界面  默认是index.html
index.jsp就可以删除了。改成index.html页面即可。

启动tomcat服务器。 (因为刚刚已经将项目部署tomcat服务器中)
所以现在只需要启动tomcat服务器 ,你的项目也随之启动

细节1补充:
访问项目的网址是什么:  默认是:localhost:8080/项目名_war_exploded/
如何修改:
首先必须要保证localhost:8080的存在    :  因为8080是端口号  localhost表示本机的ip地址

由于是在本机运行,所以可以用localhost 但是如果想要别人访问,就只能使用你的ip地址

疑问:为什么别的的网址都是www.baidu.com 因为别人购买了一个域名(别名)

细节2补充:解决控制台乱码
file -- setting --  editor -- console  --改成UTF-8

细节3补充:修改项目启动之后的浏览器。默认是ie  一般都使用谷歌浏览器
回到tomcat服务器的配置页面

细节4补充:启动tomcat 提示什么8080还是1099 什么报错   (表示端口被占用了。之前的tomcat没正常的关闭。)
解决办法:1.重启电脑   2.修改端口号   3.主要解决方式:打开任务管理器,找到进程 用户  找到java.exe关闭即可。

细节5补充:web.xml   web项目项目的起点,可以修改项目运行的起始页面等等。
例如:我的网页只有login.html  和reg.html  只有登录注册
如果没有在web.xml文件中 指明欢迎页面 默认在web目录下 找index页面
如果index都找不到 就出现404错误(404表示资源找不到。思考 路径是不是写错的)

如何设置web.xml的欢迎界面

只需要在web.xml中 添加以下代码

   <welcome-file-list>
        <welcome-file>Xxxx.html</welcome-file>
    </welcome-file-list>

以上重中之重。
疑问:我可以保证我的项目内部存在index.html页面来作为首页,  是不是可以不用掌握上面的这个知识点呢?

答:万万不行    原因:  以下场景:淘宝首页: 项目一启动(访问淘宝首页),就显示很多很多商品
这些商品的数据都是从数据库查询而来把。  想要去数据库查,就肯定需要用到java代码。
流程:项目一启动---访问java---访问数据库---获取到数据将数据还给html页面

一个web项目最基本的package结构:

    com.yyzy.
        entity  :存放数据库表的对应的实体类
        test    :存放测试的
        util    :存放工具类(可以复用的类。比如数据加密,JDBCUtil)
        dao     :存放和数据库交互的代码
        servlet :专门和html交互的java代码


项目的流程:   用户访问html页面  --  用户操作页面    ---   发送给servlet    ---  dao   ---   servlet  ---  html
servlet承担一个桥梁的作用:负责Java和html进行交互。


web项目如何导入jar包
1.在web-inf目录下手动创建一个lib文件夹(存放jar包: 什么是jar包:封装了Java的额外功能的包)
2.将相关的jar包丢进去
3.选中jar包   add as  library

复习: JDBCUtil类怎么写
    详情见com.yyzy.util.JDBCUitl
/*
    1.导入jar包
    2.静态化加载mysql驱动
    3.静态化声明数据库密码账号url地址
    4.创建一个静态方法,让别的地方可以直接通过类名访问  获取Connection连接
*/

static String url =  "jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
static String username = "root";
static String password = "root";

//优先加载   只会加载一次
static {
    try {
        Class.forName("com.mysql.cj.jdbc.Driver1");
    } catch (ClassNotFoundException e) {
        System.out.println("出错了!!!" + e);
    }
}

public static Connection getConn(){
    try {
        Connection connection = DriverManager.getConnection(url, username, password);//三个参数顺序不能随便的
        return connection;
    } catch (SQLException e) {
        System.out.println("获取连接失败"  + e);
        return null;
    }
}

第二章

<a href="index1.html">前台发送请求的三种方式</a><br><br><br>
<a href="index2.html">后台如何接受前台发出的请求---Servlet创建方式</a><br><br><br>
<a href="index3.html">前台如何发送带有数据的请求</a><br><br><br>
<a href="index4.html">后台如何接受前台的数据</a><br><br><br>
<a href="index5.html">实现用户注册基础版</a><br><br><br>
<a href="index6.html">实现用户注册进阶版</a><br><br><br>

 <p>web项目是存在缓存问题的:好处就是节省流量节省加载时间。</p>
 <p>web项目是存在缓存问题的:坏处就是无法得到理想的正确的结果。</p>
 <p>Web缓存存在的两个地方 : 1.浏览器内部--更多工具--清除浏览数据</p>
 <p>Web缓存存在的两个地方 : 2.idea项目内部的out目录(加载web项目的缓存目录)</p>
<p>前台发送请求的方式1:通过超链接</p>
<a href="http://www.baidu.com">指向互联网资源</a>
<a href="index.html">指向项目内部的页面资源</a>
<a href="/xxx">指向项目内部的Java资源</a>

<hr>
<p>前台发送请求的方式2:通过JS</p>
<button id="btn">点击按钮发送一个请求</button>

<hr>
<p>前台发送请求的方式3:通过表单</p>
<form action="index.html" method="post">
    账号:<input type="text" name="username"><br>
    <input type="submit" value="提交">
</form>


<script>
    document.getElementById("btn").onclick = function (){
        location.href = "index.html";//本质依然是超链接
    }
</script>
<p>后台如何获取前台发来的请求</p>
    <p>答:通过tomcat提供的Servlet类来实现</p>
    <p>什么是Servlet:处理前台请求的一个类</p>
    <p>如何去创建Servlet:</p>
    <p>1.导入jar包---servet-api.jar  在tomcat的lib目录里面</p>
    <p>2.在servlet的包下创建一个Servlet的类</p>
    <p>2.1 Servlet的命名规范: XxxServlet  其中Xxx表示什么功能的Servlet </p>
    <p>3.继承HttpServlet</p>
    <p>4.重写父类的service方法,然后把默认的super删除</p>
    <p>5.在类上添加@WebServlet("/Xxx") 注解。表示前台通过什么请求路径访问该类,一般和类名同名</p>

    <p>测试如下Servlet</p>
    <a href="/TestServlet">通过超链接访问Servlet</a>
    <button id="btn">通过JS访问Servlet</button>

<script>
    document.getElementById("btn").onclick = function (){
        location.href = "/TestServlet";
    }
</script>
<p>前台发送携带数据的请求的方式1:通过超链接</p>
<p>语法如下:在URL地址的后面加上?key=value&key=value&key=value的形式即可</p>
<p>注意事项:都是英文状态下的符号,如果含有中文的内容 也无需加引号</p>
<a href="index.html?id=123&name=张三">指向互联网资源</a>

<hr>
<p>前台发送携带数据的请求的方式1:通过JS</p>
<button id="btn">点击按钮发送一个请求</button>

<hr>
<p>前台发送请求的方式3:通过表单</p>
<p>注意事项:内部的表达元素都要加上name来修饰。因为后台都是通过name来获取值</p>
<p>注意事项:单选框:加上若干个相同的name即可,记得补充value</p>
<p>注意事项:多选框:加上若干个相同的name即可,记得补充value</p>
<p>注意事项:下拉框:内部的option的value值可以省略的,但是你要知道,如果省略了以option标签的内部为准。如果没省略就以value为准</p>

<form action="/RegServlet" method="post">
    账号:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    性别:
    <input type="radio" name="sex" value="男" checked >男
    <input type="radio" name="sex" value="女"  >女<br>
    爱好:
    <input type="checkbox" name="likes" value="吃">吃
    <input type="checkbox" name="likes" value="喝">喝
    <input type="checkbox" name="likes" value="玩">玩
    <input type="checkbox" name="likes" value="乐">乐
    <br>
    地址:
    <select name="address">
        <option>湖南</option>
        <option value="123广东~">广东</option>
        <option>云南</option>
    </select> <br>
    自我介绍:
    <textarea name="jieshao">自我介绍:</textarea>
    <br>
    生日:<input type="date" name="birthday"><br>
    <input type="submit" value="提交">
</form>


<script>
    document.getElementById("btn").onclick = function (){
        location.href = "index.html?id=456";//本质依然是超链接
    }
</script>
form action="/RegServlet" method="post">
    账号:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    性别:
    <input type="radio" name="sex" value="男" checked >男
    <input type="radio" name="sex" value="女"  >女<br>
    爱好:
    <input type="checkbox" name="likes" value="吃">吃
    <input type="checkbox" name="likes" value="喝">喝
    <input type="checkbox" name="likes" value="玩">玩
    <input type="checkbox" name="likes" value="乐">乐
    <br>
    地址:
    <select name="address">
        <option>湖南</option>
        <option value="123广东~">广东</option>
        <option>云南</option>
    </select> <br>
    自我介绍:
    <textarea name="jieshao">自我介绍:</textarea>
    <br>
    生日:<input type="date" name="birthday"><br>
    <input type="submit" value="提交">
</form>
需要修改的地方:
1. 修改tomcat的conf文件夹的logging.properties文件 将下面这行改成GBK
  #java.util.logging.ConsoleHandler.encoding = GBK  默认是UTF-8

2.File-setting-console编码改成GBK

3.File-setting-FileEncoding 三个地方改成UTF-8
 
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

//工具类。生成Connetion链接供dao包下的类使用
public class JDBCUtil {

    /*
        1.静态化加载驱动
        2.声明一个可以返回COnnetion链接静态方法供dao去使用
    */

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("加载mysql驱动失败" + e);
        }
    }

    public static Connection getConn(){
        try {
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
            return connection;
        } catch (SQLException e) {
            System.out.println("获取链接失败" + e);
            return  null;
        }

    }
public class UserInfoDao {


    //注册用户
    public   boolean regUserinfo(Userinfo userinfo){
        String sql = "insert into userinfo values(null,?,?,?,?,?,?,?)";
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            pre.setString(1,userinfo.getUsername());
            pre.setString(2,userinfo.getPassword());
            pre.setString(3,userinfo.getSex());
            pre.setString(4,userinfo.getLikes());
            pre.setString(5,userinfo.getAddress());
            pre.setString(6,userinfo.getJieshao());
            pre.setString(7,userinfo.getBirthday());
            int i = pre.executeUpdate();
            if (i == 1) {
                return true;
            }else{
                return false;
            }
        } catch (SQLException e) {
            System.out.println("解析sql语句失败" + e);
            return false;
        }
    }


}

<form id="f" action="/RegServlet" method="post">
    账号:<input  type="text" name="username"><br>
    密码:<input  type="password" name="password"><br>
    性别:
    <input type="radio" name="sex" value="男" checked >男
    <input type="radio" name="sex" value="女"  >女<br>
    爱好:
    <input type="checkbox" name="likes" value="吃">吃
    <input type="checkbox" name="likes" value="喝">喝
    <input type="checkbox" name="likes" value="玩">玩
    <input type="checkbox" name="likes" value="乐">乐
    <br>
    地址:
    <select name="address">
        <option>湖南</option>
        <option value="123广东~">广东</option>
        <option>云南</option>
    </select> <br>
    自我介绍:
    <textarea name="jieshao">自我介绍:</textarea>
    <br>
    生日:<input type="date" name="birthday"><br>
    <input type="submit" value="提交">
</form>


<script>
    //第一步获取对象
    var username = document.getElementsByName("username")[0];
    var password = document.getElementsByName("password")[0];
    var likes = document.getElementsByName("likes");
    var jieshao = document.getElementsByName("jieshao")[0];
    var birthday = document.getElementsByName("birthday")[0];

    function checkJieshao(){
        var jieshaoVal = jieshao.value;
        if(jieshaoVal!=""){
            return true;//将其改成生成一个提示框或文本框
        }else{
            return false;
        }
    }

    function checkBirthday(){
        var birthdayVal = birthday.value;
        if(birthdayVal!=""){
            return true;
        }else{
            return false;
        }
    }

    function checkUsername(){
        var usernameVal = username.value;
        if(usernameVal!=""){
            return true;//将其改成生成一个提示框或文本框
        }else{
            return false;
        }
    }

    function checkPassword(){
        var passwordVal = password.value;
        if(passwordVal!=""){
            return true;
        }else{
            return false;
        }
    }

    function checkLikes(){
       for(var i = 0;i<likes.length;i++){
           if(likes[i].checked){
               return true;
           }
       }
       return false;
    }



    //表单提交事件
    document.getElementById("f").onsubmit = function (){

        //满足所有的校验才可以提交
        if(checkBirthday()&&checkJieshao()&&checkLikes()&&checkPassword()&&checkUsername()){
            return true;
        }
        alert("提交失败")
        return false;
    }
</script>
第一层:前台校验,一般通过JS可以实现。  可以解决大部分的问题。
缺点1:可以通过浏览器关闭使用JS
缺点2:可以通过各种工具来绕过JS,直接访问Java后台代码  例如postman等


第二层校验:后台Java校验  一般就是长度校验,非空校验等等


第三层校验:数据库校验   一般通过约束来实现。
主键约束
外键约束
自增约束
唯一约束
非空约束
检查约束 : 近些年才开放其功能  之前仅仅是支持语法,不支持功能。  现在已经完全开放  使用高版本的mysql和navicat即可使用。
默认约束
@WebServlet("/RegServlet")
public class RegServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受数据的流程:
        //1.设置编码
        req.setCharacterEncoding("utf-8");

        //收集单独独立的数据,例如账号密码性别年龄生日自我介绍等等
        //xxx表示前台的参数名是什么  接受返回值全是String  需要自行转换
//        String xxx = req.getParameter("xxx");

        //收集多个数据:例如爱好  需要遍历 来一一取值
//        String[] xxx = req.getParameterValues("xxx");

        String username = req.getParameter("username");
        if(username.length()==0){
            System.out.println("账号不能为空");
            return ;//跳出去
        }


        System.out.println("账号为" + username);
        String password = req.getParameter("password");
        System.out.println("密码为" + password);

        String sex = req.getParameter("sex");
        System.out.println("sex为" + sex);
        String[] likes = req.getParameterValues("likes");
        System.out.println(likes);
        if(likes==null){
            System.out.println("爱好不能为空");
            return ;//跳出去
        }

        String l = "";
        for (int i = 0;i<likes.length;i++){
            if(i==likes.length-1){
                l = l + likes[i] ;
            }else{
                l = l + likes[i] + ",";
            }
        }

        String birthday = req.getParameter("birthday");
        System.out.println("birthday为" + birthday);

        String address = req.getParameter("address");
        System.out.println("address为" + address);
        String jieshao = req.getParameter("jieshao");
        System.out.println("jieshao为" + jieshao);

        UserInfoDao ud = new UserInfoDao();
        Userinfo userinfo = new Userinfo(null,username,password,sex , l ,address,jieshao,birthday);

        boolean b = ud.regUserinfo(userinfo);
        System.out.println(b);
    }

第三章

public class UserDao {

    public UserDao(){
        System.out.println("UserDao被调用了被实例化了(new)");
    }

    public void say(){
        System.out.println("执行了userdao的Xx方法");
    }

}
@WebServlet("/AServlet")
public class AServlet  extends HttpServlet {
    UserDao ud = null;

    @Override
    public void init() throws ServletException {
        ud = new UserDao();
        System.out.println("我被创建了,只会执行一次");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进来了");
        //servlet的生命周期:
        // 1.初始化调用init方法 只会执行一次   自动执行
        // 2.执行 调用service方法,调用几次执行几次 需要手动调用
        // 3.消亡调用destory方法 只会执行一次  自动执行 没啥用,一般是项目停止自动执行。
        ud.say();
    }

    @Override
    public void destroy() {
        System.out.println("我死了");
    }
}
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我是Bservlet");
        //转发跳转:
//      req.getRequestDispatcher("AServlet").forward(req,resp);
        req.getRequestDispatcher("index.html").forward(req,resp);


    }


}
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我是Cservlet");

        //重定向跳转:
//        resp.sendRedirect("xxx");
        resp.sendRedirect("index.html");


    }


}
@WebServlet("/DServlet")
public class DServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我是Dservlet");

        System.out.println("这里模拟dao操作,已经收集好了数据....");

        //注册完成,跳转到首页
        req.getRequestDispatcher("index.html").forward(req,resp);


    }


}
@WebServlet("/EServlet")
public class EServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("我是Dservlet");

        System.out.println("这里模拟dao操作,已经收集好了数据....");

        //注册完成,跳转到首页
        resp.sendRedirect("index.html");


    }


}
@WebServlet("/FServlet")
public class FServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效
        //如何存储数据  注意key要保证唯一,否则会被覆盖
//        req.setAttribute("key","aa");

        req.setAttribute("username","张三");

        req.getRequestDispatcher("ZServlet").forward(req,resp);
//        resp.sendRedirect("ZServlet");

    }


}
@WebServlet("/GServlet")
public class GServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        session作用域:重点掌握:作用域一次会话有效。浏览器关闭就失效
        //如何存储数据  注意key要保证唯一,否则会被覆盖
        //1.获取session对象
        HttpSession session = req.getSession();
        //2.存值
        session.setAttribute("username","李四");
        //简写req.getSession().setAttribute("aa,","xx");


        req.getRequestDispatcher("ZServlet").forward(req,resp);
//        resp.sendRedirect("ZServlet");

    }


}
@WebServlet("/HServlet")
public class HServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//       application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量
        //如何存储数据  注意key要保证唯一,否则会被覆盖
        //1.获取application对象
        ServletContext context = req.getServletContext();
        //2.存值
        context.setAttribute("username","王五");
        req.getRequestDispatcher("ZServlet").forward(req,resp);
//        resp.sendRedirect("ZServlet");

    }


}
@WebServlet("/ZServlet")
public class ZServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //测试四大作用域的数据

//        String username =(String) req.getAttribute("username");
//        System.out.println(username);

//        Object o = req.getSession().getAttribute("username");
//        System.out.println(o);

        Object o = req.getServletContext().getAttribute("username");
        System.out.println(o);

    }


}
<a href="AServlet">知识点1:演示servlet的生命周期</a>

<hr>
<a href="index1.html">演示servlet的跳转</a>

<hr>
<a href="index2.html">演示转发跳转的弊端</a>
<hr>
<a href="index3.html">演示重定向跳转</a>
<hr>
<a href="index4.html">演示Servlet的四大作用域</a>
<p>
    servlet的跳转:
    1.可以从servlet跳转到另外一个servlet(删除数据之后返回到刷新查询servlet)
    2.可以从servlet跳转到前台页面(注册成功返回登录页面)
    有两种方式: <br>
    <a href="BServlet">通过转发跳转</a><br>
    <a href="CServlet">通过重定向跳转</a><br>
</p>
<p>
    转发跳转:   只需1次请求即可完成  效率高    URL地址不会改变  例如从B转发到A  URL地址依然是B <br>
    重定向跳转: 只需2次请求即可完成  效率低     URL地址会改变   例如从B定向到A  URL地址就是A<br>

    总结:能用转发就用转发。但是以下情况不推荐:涉及到敏感操作一定不能使用转发,
    涉及到注册操作.涉及到增删改都推荐使用重定向

    备注:超链接本质就是重定向跳转
</p>
<h3>注册页面</h3>
<form action="DServlet" method="post">
   账号 <input type="text"  name="username" >
   密码 <input type="password"  name="password" >
    <input type="submit" value="注册">
</form>
<h3>Servlet的四大作用域</h3>
<p>有些情况下:我们需要实现后台servlet的数据共享(先掌握这里)</p>
<p>有些情况下:我们需要实现后台servlet和前台页面的数据共享(暂时不讲解)</p>
<p>比如:后台查询到了数据 需要丢给前台去渲染</p>
<p>四大作用域:pageContext < request < session < application </p>
<p>pageContext作用域:仅在当前页面有效,只要页面发生了跳转就失效。 所以不用</p>
<p>request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效,所以切忌使用重定向跳珠</p>
<p>session作用域:重点掌握:作用域一次回话有效。(浏览器打开到关闭为一次回话)</p>
<p>application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量</p>

<a href="FServlet">测试request作用域</a> <hr>
<a href="GServlet">测试session作用域</a> <hr>
<a href="HServlet">测试application作用域</a> <hr>

第四章

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("info1","你好111");
        req.getSession().setAttribute("info1","你好222");
        ServletContext context = req.getServletContext();
        context.setAttribute("info1","你好333");
        req.getRequestDispatcher("2.jsp").forward(req,resp);
    }
}
<a href="1.jsp">jsp简介</a>  <hr>
<a href="2.jsp">EL表达式</a>  <hr>
<h3>JSP简介</h3>


<p>为什么要学习JSP:</p>
<p>答:默认的HTML技术是无法将后台的数据直接渲染在前台的</p>
<p>例如在后台的request容器,session容器存了东西,要想在前台拿出来渲染,单独利用HTML无法实现的</p>
<p>所以需要借助额外的知识点才可以实现:   例如JSP技术,AJAX技术等</p>

<h3>JSP的组成</h3>
<p>JSP组成: HTML  +  Java    +  JSP本身 </p>
<p>不仅可以写html代码还可以写java代码还可以写JSP代码</p>
<p>但是一般来说 不会再JSP里面写Java代码,最多写点JSP代码 </p>
<p>JSP的本质:本质就是一个Servlet .运行流程:现将JSP解析成servlet再运行。</p>

<h3>JSP现状</h3>
<p>25年前的技术,早已过时,无人问津。所以本书的内容仅做了解。(我讲的都掌握即可)</p>
<p>技术领域:存在即合理。  即使已经过时了。但是过时的原因仅仅是:后人借鉴了它,然后超过了它</p>
<p>原因:效率极低。现在的项目都是讲究一个前后端分离。  前台只操心前台,后台只操心后台</p>


<p>两种注释的区别: JSP的注释不会被解析到浏览器中,而HTML会</p>
<!--我是HTML注释 -->
<%--我是JSP注释  --%>
<h3>EL表达式:</h3>

<p>知识点1:仅仅存在于JSP中,脱离了JSP无法运行。</p> <hr>
<p>知识点2:可以直接将后台数据渲染在页面上。</p> <hr>
<p>知识点3:语法:  美元符号{ xxx }   </p><hr>

例如:可以实现基本的运算: ${1+1+1}   ${1*5*2}  ${"111" + "222"}   <br>
<hr>

例如:可以轻松地获取后台容器的数据: <a href="AServlet">先存几个</a> <br>
${info1}  ~~~ ${info2} ~~~  ${info3}   <br>
<br>如果存在 不同的容器 但是key相同 。那么可以在key的前面加上前缀即可:例如 <br>
${requestScope.info1}  ~~~ ${sessionScope.info1} ~~~  ${applicationScope.info1}

<hr>

例如:可以轻松的获取url地址上的相关参数
<a href="update.jsp?id=123&name=张三&age=18">修改页面</a>
<head>
    <title>Title</title>
</head>
<body>

<p>下面的写法是获取容器里面的id,但是现在我们要获取url地址里面相关参数</p>
~${id}~
<p>如果想要获取url地址上的参数,那么只需要加上前缀 param</p>
${param.id} ~~${param.name} ~~${param.age} ~~

第五章

课后作业(加分)

用户表:
id 主键  int
账号:username   varchar(50)
密码:password    varchar(50)

项目启动,显示注册页面和登录页面。

实现注册功能和登录功能。
如果登录成功进入欢迎界面,显示用户的用户名。

1.创建相关的数据库表并插入测试数据

2.创建一个Web项目并通过tomcat部署

3.搭建基本的项目模板:导入基本的jar包(mysql驱动包,servlet的包,jsp的包)
创建基本的package    ----   entity   dao   servlet   test   util

4.创建必备的类----    和数据库相对应的实体类    和  JDBCUtil    并编写测试类测试

以上四个步骤:不管什么项目 都是固定的。
后续步骤就是根据题目需求 改变相关的写法,但是思路也是固定的。

5.根据题目需求:
编写注册页面和登录页面 以及页面的调整。

如何快速创建实体类:
老写法:  私有化声明属性:  提供无参,有参,set/get  toString   至少需要1分钟、


有网的环境下(第一次有网即可(因为需要下载idea的插件))
第一次弄好之后,后续就随意有没有网了。

所以该技术  只需要在自己的笔记本上执行即可。  这个技术 是未来即使工作了  都肯定会用。 

如何使用:
1.有网的环境下下载插件  file - setting  - plugins  - Marketplace  搜索: Lombok  注意大小写
看到右侧有个红辣椒 即可  点击install安装即可。 重启idea

2.使用相关的jar包。


凡是如果需要jar包:去网上找的缺点: 鱼龙混杂,大部分都是广告,就算提供了下载地址 也给你捆包了很多垃圾软件。
版本也可能不是你想要的。
所以应该去这个,应有尽有:https://mvnrepository.com/

搜索相关名字 点击jar超链接 下载。然后导入项目内部。

然后只需要在实体类的上方 加上
@Data
@AllArgsConstructor
@NoArgsConstructor
即可。
表示生成: 无参和全参 和set/get 和toString
如果你想使用 部分参数的构造方法 就需要自己去生成了


如果想要精美前台页面:
提供一个免费的下载网址:https://www.jq22.com/


自动登录的原理:

用户或网站  在第一次登录的时候 将你的账号和密码保存在你的客户端---cookie中
当你下次访问,直接取出第一次登录的时候保存的账号密码进行直接登录  来实现自动登录的效果
问题:非法用户 可以根据浏览器保存的账号密码进行 获取   解决方式:加密
过滤器讲解:
    全称:Servlet过滤器   Servlet就是Servlet    Servlet过滤器就是Servlet过滤器

    翻译:Filter

    功能:客户端发请求给服务端。 服务端回响应给客户端   进行代码的处理。

    用处: 最常见的编码过滤器   登录校验过滤器   等等

    如何实现:一般放在filter包下

    如何创建一个Filter
        1.创建一个类
        2.实现Filter接口 注意是Servlet下的Filter接口
        3.重写该接口下的所有方法分别是init(初始化) destory(消亡)  doFilter(过滤的相关代码)
        4.添加注解 @WebFilter("/Xxx")   Xxx表示我要过滤哪些请求或响应  一般来说都写/*  表示过滤所有请求
        5.写相关代码。
        6.根据条件进行放行。通过方法内部提供的参数:filterChain 进行放行


    客串知识点:
        过滤器又称拦截器   如果过滤器中没有写  “放行”  相关代码  项目将显示一个空白页面。
        所以正确的写法:  如果过滤成功就放行。  如果过滤失败就跳转到指定页面



    客串知识点2:
        一个项目中可以存在多个过滤器   那么就存在一个过滤器的优先级问题
        优先级的原则 也很简单:根据类名的首字母

   客串知识点3:
            过滤器内部提供的request和response 是ServletRequest   ServletResponse

            但是Servlet提供的request和response 是HttpServletRequest   HttpServletResponse

            然后HttpServletRequest的request和HttpServletResponse的response的功能 是远多于:
            ServletRequest和ServletResponse的request和response

            所以如果该过滤器只需要实现低级功能 就无须转换。
            如果该过滤器需要实现高级功能就需要在方法的内部进行强转
             HttpServletRequest req = (HttpServletRequest)servletRequest;




             利用过滤器实现 登录校验:
                凡是没经过登录校验    无法访问到 后台页面的。

                传统思路:  在每个页面都加上登录校验 如果有1000个隐私页面 我就要1000个校验

                正常思路:  创建一个Filter过滤器 实现登录校验。

<div align="center">
    <h3>登录表单</h3>
    <h5> ${info} </h5>
    <form action="LoginServlet" method="post">
        账号:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
        <hr>
        <a href="reg.jsp">没有账号?转去注册</a>
    </form>
</div>
<div align="center">
    <h3>注册表单</h3>
    <h6>${info}</h6>
    <form action="RegServlet" method="post">
        账号:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="注册">
        <hr>
        <a href="login.jsp">已有账号?转去登录</a>
    </form>
</div>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!--
    如果容器中的数据是简单的单个对象 就使用EL表达式  直接通过 \${xxx}来渲染即可
   如果容器中的数据是复杂的集合对象 就使用JSTL表达式
    步骤1:1.引入  2.通过foreach标签便利
-->

<html>
<head>
    <title>Title</title>
    <style>
        td{
            width: 200px;
        }
    </style>
    <link href="css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div align="center">
    欢迎登录成功~~~  ${info}  用户名为:${username}
    <br>
    查询页面
    <table  class="table table-striped table-hover">
        <Tr>
            <td>编号</td>
            <td>账号</td>
            <td>密码</td>
            <td>删除</td>
            <td>修改</td>
        </Tr>

        <!--后面的tr td都要从数据库中查询数据,然后渲染 -->
        <c:forEach items="${list}"  var="aaa" >
            <Tr>
                <td>${aaa.id}</td>
                <td>${aaa.username}</td>
                <td>${aaa.password}</td>
                <td><button id="${aaa.id}" class="btn btn-outline-danger">删除</button> </td>
                <td><button class="btn btn-outline-warning"><a href="update.jsp?id=${aaa.id}&username=${aaa.username}&password=${aaa.password}">修改</a></button></td>
            </Tr>
        </c:forEach>


    </table>


</div>


<script src="js/bootstrap.js" ></script>
<script>
    var btn = document.getElementsByClassName("btn-outline-danger");

    for(let i = 0;i<btn.length;i++){
        btn[i].onclick = function (){
            let b = confirm("是否删除?");
            if (b){
                //获取当前按钮的id属性
                let id = this.getAttribute("id");
                location.href = "/DelServlet?id=" + id;

            }
        }
    }

</script>

</body>
</html>
<div align="center">
    <h3>修改表单</h3>
    <form action="/UpdateServlet" method="post">
        编号:<input type="text" name="id" readonly value="${param.id}"  > <br>
        账号:<input type="text" name="username" value="${param.username}"  > <br>
        密码:<input type="text" name="password" value="${param.password}"  ><br>
        <input type="submit" value="修改">
        <hr>
        <a href="reg.jsp">没有账号?转去注册</a>
    </form>
</div>
package com.yyzy.dao;

import com.yyzy.entity.Userinfo;
import com.yyzy.util.JDBCUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserinfoDao {

    //查询所有的用户数据
    public List<Userinfo> queryAll(){
        String sql = "select * from userinfo";
        List<Userinfo> list = new ArrayList<Userinfo>();
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            ResultSet rs = pre.executeQuery();
            while (rs.next()){
                //进入了while循环 说明查询到了数据
                Userinfo userinfo = new Userinfo(rs.getInt(1),rs.getString(2),rs.getString(3));
                list.add(userinfo);
            }
            return list;
        } catch (SQLException throwables) {
            System.out.println("查询的sql处理失败" + throwables);
            return null;
        }
    }


    //登录
    public boolean login(String username,String password){
        String sql = "select * from userinfo where username = ? and password = ?";
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            pre.setString(1,username);
            pre.setString(2,password);
            ResultSet rs = pre.executeQuery();
            while (rs.next()){
                //进入了while循环 说明查询到了数据
                return true;
            }
            return false;
        } catch (SQLException throwables) {
            System.out.println("登录的sql处理失败" + throwables);
            return false;
        }

    }


    //注册
    public boolean reg(String username,String password){
        String sql = "insert into userinfo values(null,?,?)";
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            pre.setString(1,username);
            pre.setString(2,password);
            int i = pre.executeUpdate();
            if (i==1) {
                return true;
            }else{
                return false;
            }

        } catch (SQLException throwables) {
            System.out.println("注册的sql语句处理失败"  + throwables);
            return false;
        }
    }



    //删除
    public boolean del(int id){
        String sql = "delete from userinfo  where id = ? ";
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            pre.setInt(1,id);
            int i = pre.executeUpdate();
            if (i==1) {
                return true;
            }else{
                return false;
            }

        } catch (SQLException throwables) {
            System.out.println("删除的sql语句处理失败"  + throwables);
            return false;
        }
    }

    //修改
    public boolean update(int id,String username,String password){
        String sql = "update userinfo set username = ? ,password = ? where id = ?";
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            pre.setString(1,username);
            pre.setString(2,password);
            pre.setInt(3,id);
            int i = pre.executeUpdate();
            if (i==1) {
                return true;
            }else{
                return false;
            }

        } catch (SQLException throwables) {
            System.out.println("修改的sql语句处理失败"  + throwables);
            return false;
        }
    }

}
package com.yyzy.entity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Userinfo {
    private Integer id;
    private String username;
    private String password;


}
package com.yyzy.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;


@WebFilter("/*")
public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        servletRequest.setCharacterEncoding("utf-8");

        filterChain.doFilter(servletRequest,servletResponse);


    }

    @Override
    public void destroy() {

    }
}
package com.yyzy.filter;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

// login.jsp  reg.jsp  /LoginServlet /RegServlet   /  这5个请求是不需要做校验的
@WebFilter("/*")
public class LoginFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {


        HttpServletRequest req = (HttpServletRequest)servletRequest;

        // login.jsp  reg.jsp  /LoginServlet /RegServlet   /  这5个请求是不需要做校验的
        System.out.println("获取当前的请求的URL地址是" + req.getRequestURI());
        String url[] = {"/login.jsp" ,"/reg.jsp" ,"/LoginServlet" ,"/RegServlet" ,"/" };

        for(int i = 0 ; i<url.length ; i++){
            if(req.getRequestURI().equals(url[i])){
                filterChain.doFilter(servletRequest,servletResponse);
                return;
            }
        }



        String info = (String)req.getSession().getAttribute("info");
        System.out.println(info);
        if("登录成功".equals(info)){
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            System.out.println("校验失败~~~");
            req.setAttribute("info","休想非法访问");
            servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest,servletResponse);
        }


    }

    @Override
    public void destroy() {

    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;
import com.yyzy.entity.Userinfo;
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.util.List;

@WebServlet("/DelServlet")
public class DelServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int id = Integer.parseInt( req.getParameter("id"));

        UserinfoDao ud = new UserinfoDao();
        boolean b = ud.del(id);
        if (b){
            List<Userinfo> list = ud.queryAll();
            req.setAttribute("list",list);
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }else{
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }
    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;
import com.yyzy.entity.Userinfo;

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.util.List;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("GBK");

        String username = req.getParameter( "username");
        System.out.println("当前账号为" + username);
        String password = req.getParameter("password");
        UserinfoDao ud = new UserinfoDao();
        boolean b = ud.login(username, password);
        if (b){

            req.getSession().setAttribute("info","登录成功");
            req.setAttribute("username",username);

            List<Userinfo> list = ud.queryAll();
            req.setAttribute("list",list);
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }else{
            req.setAttribute("info","登录失败");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;

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("/RegServlet")
public class RegServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UserinfoDao ud = new UserinfoDao();
        boolean b = ud.reg(username, password);

        if (b){
            req.setAttribute("info","注册成功");
            req.getRequestDispatcher("reg.jsp").forward(req,resp);
        }else{
            req.setAttribute("info","注册失败");
            req.getRequestDispatcher("reg.jsp").forward(req,resp);
        }
    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;
import com.yyzy.entity.Userinfo;

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.util.List;

@WebServlet("/UpdateServlet")
public class UpdateServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int id = Integer.parseInt( req.getParameter("id"));
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UserinfoDao ud = new UserinfoDao();
        boolean b = ud.update(id,username, password);
        if (b){

            List<Userinfo> list = ud.queryAll();
            req.setAttribute("list",list);
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }else{
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }
    }
}
package com.yyzy.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class JDBCUtil {

    //熟练掌握  alt+enter的快捷键
    //作用1:帮你处理异常    作用2:帮你自动生成返回值
    //如何去用: 哪里红了放哪里

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("数据库加载失败");
        }
    }

    public static Connection getConn(){
        try {
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
            return connection;
        } catch (SQLException throwables) {
            System.out.println("获取连接失败"  + throwables);
            return null;
        }
    }
}

第六章

1. 利用MD5加密技术 实现对敏感数据实现加密功能。

2. 利用Cookie技术实现记住账号  和  记住自动登录功能   和    注册功能

完成该项目的步骤:
1.建库建表插入测试数据
2.创建Web项目并部署tomcat服务器
3.导入项目必备的jar包
4.创建几个必备的包      entity   dao(data  access  object)   servlet  test  util   filter
5.创建一个必备的类: 分别是和表对于的实体类。  获取数据库连接的JDBC工具类    设置编码的过滤器

6.随着需求的改变而改变



MD5加密技术:一种常见的加密算法,可以对数据进行加密。

注意:注册的时候进行加密然后存在数据库中
注意:登录的时候也要进行加密,然后和数据库加密之后的数据进行对比。
例如密码:1234  加密之后变成了 abcd。
所以登录的时候依然使用1234进行登录。然后将加密之后的1234 和abcd进行对比。

如何使用MD5加密技术:
1.导入jar包
2.创建MD5对象:
Mademd5 md = new Mademd5();
String str = "1234";//原密码
String s = md.toMd5(str);//加密之后的密码
System.out.println(s);


专业技术扫盲:
什么叫数据的不可逆性:
只能从A变成B
无法将B反推成A


数据的穷举法:
一个一个去测试。 当你测试出1234的加密是abcd  就可以得出一个结论abcd经过解密之后是1234



Cookie技术讲解:
    什么Cookie :
        保存在客户端的一段字符串。 格式为:key-value
    如何在浏览器查看Cookie:
        F12   application

    应用场景:  自动登录  记住账号   浏览记录   查询记录

    Cookie的优点:保存在客户端  减轻服务器的压力
    Cookie的缺点:保存在客户端  容易被非法用户获取

    Cookie的备注:
        生命周期: 默认的有效期  一次会话(浏览器打开到关闭为一次会话)
        无法跨域: 这是浏览器自带的安全机制而非Cookie的


    如何在Servlet中创建Cookie
             //1.创建一个Key为username    value为username的Cookie
             Cookie c1 = new Cookie("username" , username);
             //2.设置Cookie的生命周期单位是秒
             c1.setMaxAge(3600*24*31);//一个月
             //3.将其添加进浏览器
             resp.addCookie(c1);


    如何在Servlet中删除Cookie

    如何在Servlet中查询Cookie

    如何在Servlet中修改Cookie(删除后添加)

    如何在JSP中读取Cookie
        ${cookie.xxx}

自动登录的原理:

客户访问登录页面:

底层实现原理:
   让用户看到登录页面之前,先去后台检查是否存在Cookie  如果存在,就将相关数据拿去和数据库进行比对。  比对成功就绕过登录页面直接去往成功页面
   反正就回到登录页面重新登录 提示登录信息已过期

所以根据实现原理得知:  不是单纯的指向login.jsp页面

而是指向一个后台。 由有台进行换


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <div align="center">

        <h3>登录表单</h3>
        <h5> ${info} </h5>
        <form action="LoginServlet" method="post">
            账号:<input type="text" value="${cookie.username.value}" name="username"> <br>
            密码:<input type="password" name="password"><br>
            <input type="checkbox" name="a1" value="a1">记住账号
                <input type="checkbox"  name="a2" value="a2">自动登录<br>
            <input type="submit" value="登录">
            <hr>

            <a href="reg.jsp">没有账号?转去注册</a>
        </form>
    </div>


</body>
<script>
    //如何在JS中获取EL表达式   加引号即可
    var aaa = "${cookie.aaa.value}";


    //思想:获取Cookie 如果有aaa 就勾选  反之不勾

    if(aaa=="aaa"){
        document.getElementsByName("a2")[0].setAttribute("checked","checked");
    }



</script>

</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <div align="center">
        <h3>注册表单</h3>
        <h6>${info}</h6>
        <form action="RegServlet" method="post">
            账号:<input type="text" name="username"> <br>
            密码:<input type="password" name="password"><br>
            <input type="submit" value="注册">
            <hr>
            <a href="CheckCookieServlet">已有账号?转去登录</a>
        </form>
    </div>

</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/11/23
  Time: 10:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
登录成功  <a href="/DelCookieServlet">退出自动登录</a>
</body>
</html>
package com.yyzy.dao;

import com.ndktools.javamd5.Mademd5;
import com.yyzy.util.JDBCUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserinfoDao {


    //注册
    public boolean reg(String username,String password){
        String sql = "insert into userinfo values(null,?,?)";
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            pre.setString(1,username);

            Mademd5 md = new Mademd5();
            String s = md.toMd5(password);
            pre.setString(2,s);

            int i = pre.executeUpdate();
            if (i==1){
                return true;
            }else{
                return false;
            }

        } catch (SQLException throwables) {
            System.out.println("注册SQL语句出现错误" + throwables);
            return false;
        }


    }



    //登录
    public boolean login(String username,String password){
        String sql = "select * from userinfo where username = ? and password = ?";
        Connection conn = JDBCUtil.getConn();
        try {
            PreparedStatement pre = conn.prepareStatement(sql);
            pre.setString(1,username);

            Mademd5 md = new Mademd5();
            String s = md.toMd5(password);
            pre.setString(2,s);

            ResultSet rs = pre.executeQuery();
            while (rs.next()){
                return true;
            }
            return false;
        } catch (SQLException throwables) {
            System.out.println("登录SQL语句出现错误" + throwables);
            return false;
        }
    }

}
package com.yyzy.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/CheckCookieServlet")
public class CheckCookieServlet extends HttpServlet {




    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        String username = "";//将cookie的值存
        String password = "";

        if (cookies!=null){


            for(int i = 0 ;i<cookies.length;i++){
                if(cookies[i].getName().equals("username")){
                    username = cookies[i].getValue();
                }

                if(cookies[i].getName().equals("password")){
                    password = cookies[i].getValue();
                }

            }
            UserinfoDao ud = new UserinfoDao();

            boolean b = ud.login(username, password);

            if (b){
                req.getRequestDispatcher("success.jsp").forward(req,resp);
            }else{
                req.setAttribute("info","登录信息已经失效");
                req.getRequestDispatcher("login.jsp").forward(req,resp);
            }
        }
    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/DelCookieServlet")
public class DelCookieServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();


        if (cookies!=null){


            for(int i = 0 ;i<cookies.length;i++){
                if(cookies[i].getName().equals("username")){
                    cookies[i].setMaxAge(0);
                    resp.addCookie(cookies[i]);
                }

                if(cookies[i].getName().equals("password")){
                    cookies[i].setMaxAge(0);
                    resp.addCookie(cookies[i]);
                }

            }

            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UserinfoDao ud = new UserinfoDao();

        boolean b = ud.login(username, password);

        if (b){
            //登录成功: 判断用户是否勾选了记住账号功能
            String a1 = req.getParameter("a1");
            if ("a1".equals(a1)){//说明勾选了记住账号。 将账号保存在Cookie中
                //1.创建一个Key为username    value为username的Cookie
                Cookie c1 = new Cookie("username" , username);
                //2.设置Cookie的生命周期单位是秒
                c1.setMaxAge(3600*24*31);//一个月
                //3.将其添加进浏览器
                resp.addCookie(c1);
            }

            //登录成功: 判断用户是否勾选了自动登录功能
            String a2 = req.getParameter("a2");


            if ("a2".equals(a2)){//说明勾选了记住账号。 将账号保存在Cookie中
                //1.创建一个Key为username    value为username的Cookie
                Cookie c1 = new Cookie("username" , username);
                //2.设置Cookie的生命周期单位是秒
                c1.setMaxAge(3600*24*31);//一个月
                //3.将其添加进浏览器
                resp.addCookie(c1);

                //1.创建一个Key为username    value为username的Cookie
                Cookie c2 = new Cookie("password" , password);
                //2.设置Cookie的生命周期单位是秒
                c2.setMaxAge(3600*24*31);//一个月
                //3.将其添加进浏览器
                resp.addCookie(c2);

                //1.创建一个Key为username    value为username的Cookie
                Cookie c3 = new Cookie("aaa" , "aaa");
                //2.设置Cookie的生命周期单位是秒
                c3.setMaxAge(3600*24*31);//一个月
                //3.将其添加进浏览器
                resp.addCookie(c3);

            }

            req.getRequestDispatcher("success.jsp").forward(req,resp);
        }else{
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }
}
package com.yyzy.servlet;

import com.yyzy.dao.UserinfoDao;

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("/RegServlet")
public class RegServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UserinfoDao ud = new UserinfoDao();

        boolean b = ud.reg(username, password);

        if (b){
            req.setAttribute("info","注册成功");
        }else{
            req.setAttribute("info","注册失败");
        }

        req.getRequestDispatcher("reg.jsp").forward(req,resp);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值