Bootstrap

JavaWeb开发--超详细个人手写笔记代码步骤

1.准备工作

前面的学生javase开发,而javaweb开发需要服务器和网页。

具备: java mysql jdbc html+css+js

web服务器: tomcat服务器. 部署项目。

Apache Tomcat® - Apache Tomcat 8 Software Downloads

解压上面的软件即可 (不要放在中文目录和特殊符号的目录

启动tomcat服务器

如果你的启动时一闪而过,证明jdk配置有误。

没有配置JAVA_HOME=

访问tomcat

http://服务所在的ip:8080

1.1idea创建web工程

web工程表示里面既可以写java代码也可以放置页面资源。

1.2web工程部署到本地的tomcat服务器中

localhost本地服务器的地址

8080:本地服务器的端口号

qy174_web03表示项目部署的上下文名称

main.html:本地项目的资源名称

1.3设置默认首页

当项目启动时默认打开的资源名

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--设置默认首页-->
    <welcome-file-list>
        <welcome-file>main.html</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

2.动态网页

动态网页就是结合和java编程和数据库技术。而且动态网页中可以插入java代码。常用的动态网页

jsp,freemark,thymeleaf等这些都是常用的动态网页技术。 而我们这里主要讲解jsp.

2.1什么是jsp

jsp【java server page】java服务器网页。该网页经过服务器tomcat编译产生java代码.而且里面可以插入java代码。

2.2jsp中如何插入java代码

<%

java语法的代码

%>

2.3java内容输出到网页中

有两种方式:

第一种使用out对象输出

第二种:<%=表达式%>

<%
int a = 10;
int b = 20;
int c = a + b;
out.print("c="+c+"<br>");//第一种
out.print("a="+a+"<br>");
%>

c=<%=c%><br>//第二种
a=<%=a%>

<table border="1" cellpadding="0" cellspacing="0" width="800">
    <%
        for (int i = 1; i < 10; i++) {
            out.print("<tr>");
            for (int j = 1; j <= i; j++) {
                out.print("<td>"+j+"*"+i+"="+i*j+"</td>");
            }
            out.print("</tr>");
        }
    %>
   </table>
<table border="1" cellpadding="0" cellspacing="0" width="800">
       <%for (int i = 1; i < 10; i++) {%>
       <tr>
           <% for (int j = 1; j <= i; j++) {%>
           <td><%=j%> * <%=i%> = <%=j*i%></td>
           <%}%>
           <br>
       </tr>
        <%}%>
   </table>

错误类型

400~499:前端问题。 ==404路径找不到问题== 400: 参数类型不匹配[框架]。 405请求方式不匹配

500: 服务器错误【java功能错误---junit测试---->[发到群里---发出解决方案]】。

3.接受参数

表单提交和超链接传递参数时,我们需要接受传递过来的参数内容。并完成相应的业务功能。servlet中封装了HttpServletRequest类,该类可以操作所有的请求内容。而在jsp中内置了该类的对象request。[内置表示无需自己创建该类对象。就可以使用该类中的方法]

3.1如果idea无法在jsp中使用内置对象

在web-inf下创建一个目录lib,放入jsp和servlet的jar包

3.2解决中文乱码

当表单输入的内容为中文时,接受时出现了乱码文件。

调用request中setCharacterEncoding("utf-8")

设置请求的编码:注意接收参数前设置utf-8要和网页的编码一致。

编码种类:ISO-8859-1:英文编码 不支持中文

gbk:中文编码 繁体中文和简体中文

gb2312:中文编码,只支持简体中文

utf-8:万国码,经常使用

3.3接受表单的参数

<%--action:表单提交的路径  method:表单的提交方式--%>
<form action="registerDo.jsp" method="post">
        账号:<input name="zh" type="text"><br>
        密码:<input name="pwd" type="text"><br>
        性别:<input name="sex" type="radio" value="男">男
        <input name="sex" type="radio" value="女">女
        <br>
        爱好:<input name="hobby" type="checkbox" value="游泳">游泳
        <input name="hobby" type="checkbox" value="唱歌">唱歌
        <input name="hobby" type="checkbox" value="跳舞">跳舞
        <br>
        国家:<select name="country">
                    <option>china</option>
                    <option>USA</option>
                    <option>JAPANESE</option>
            </select><br>
        描述:<textarea name="desc"></textarea><br>
        <input type="submit" value="提交">
</form>

<body>
    <%
    //设置请求的编码:utf-8万国码
        request.setCharacterEncoding("utf-8");
    //内置HttpServletRequest的对象
    //接受请求的参数值
        String zh = request.getParameter("zh");
        String pwd = request.getParameter("pwd");
        String sex = request.getParameter("sex");
    //多选框--用getParameter只能拿到一个值。
        String[] hobby = request.getParameterValues("hobby");
        String country = request.getParameter("country");
        String desc = request.getParameter("desc");
    %>
    账号:<%=zh%><br>
    密码:<%=pwd%><br>
    性别:<%=sex%><br>
    爱好:<%=Arrays.toString(hobby)%><br>
    国家:<%=country%><br>
    描述:<%=desc%><br>
</body>

3.4超链接传递参数

地址?key=value&key=value

4.jsp+dao

<%--
  Created by IntelliJ IDEA.
  User: WJY
  Date: 2024/5/6
  Time: 15:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>验证首页</title>
</head>
<body>
<%String error = request.getParameter("error");
    if ("1".equals(error)){%>
    <script>
        alert("账号或密码错误");
    </script>
    <%}%>

<%String success = request.getParameter("success");
    if ("1".equals(success)){%>
    <script>
        alert("注册成功请登录!")
    </script>
    <%}%>

  <form action="login_test.jsp" method="post">
     账号:<input type="text" name="name" required/><br>
     密码:<input type="password" name="password" required/><br>
      <input type="submit" value="登录"/>
      <input type="button" value="注册" onclick="location.href='enroll.jsp'"/>
  </form>
</body>
</html>
<%@ page import="com.wjy.dao.UsersDao" %>
<%@ page import="com.wjy.entity.Users" %><%--
  Created by IntelliJ IDEA.
  User: WJY
  Date: 2024/5/6
  Time: 16:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表单提交的路径(测试响应过程)</title>
</head>
<body>
<%
    request.setCharacterEncoding("utf-8");
    String name = request.getParameter("name");
    String password = request.getParameter("password");

    UsersDao usersDao = new UsersDao();
    Users users = usersDao.selectByNameAndPassword(name,password);
    if (users != null) {
        response.sendRedirect("login_success.jsp");//登录成功--跳转登录成功后的页面
    }else {
        response.sendRedirect("verify.jsp?error=1");//登录失败--跳转重新登录页面
    }
%>
</body>
</html>
<%@ page import="com.wjy.entity.Users" %><%--
  Created by IntelliJ IDEA.
  User: WJY
  Date: 2024/5/6
  Time: 16:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功登录页面</title>
</head>
<body>
成功登录!
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: WJY
  Date: 2024/5/6
  Time: 17:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册页面</title>
</head>
<body>
    <form action="enroll_test.jsp" method="post">
    账号:<input type="text" name="name" required/><br>
    密码:<input type="password" name="password" required/><br>
        <input type="submit" value="注册"/>
    </form>
</body>
</html>
<%@ page import="com.wjy.dao.UsersDao" %>
<%@ page import="com.wjy.entity.Users" %><%--
  Created by IntelliJ IDEA.
  User: WJY
  Date: 2024/5/6
  Time: 16:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<%
  request.setCharacterEncoding("utf-8");
  String name = request.getParameter("name");
  String password = request.getParameter("password");

  UsersDao usersDao = new UsersDao();
  int row = usersDao.add(name,password);
  if (row>0){
    response.sendRedirect("verify.jsp?success=1");//注册成功--进行登录
  }else {
    response.sendRedirect("enroll.jsp");//注册失败--重新注册
  }
%>
</body>
</html>

5.单元测试

测试写的功能。第一种:使用主函数(不方便后续操作检查)

第二种: 使用junit单元测试(方便后续操作检查,直接选择要测试的方法允许即可)

5.1加入单元测试的依赖

  //注意:该方法没有参数,也没有返回值。
    StudentDao studentDao=new StudentDao();
    @Test
    public void testFindAll(){
        List<Student> list = studentDao.findAll();
        for(Student s:list){
            System.out.println(s.getName()+"--->"+s.getAge());
        }
        
    }

6.JSP+dao完成crud操作(增删改查)

在上面成功登录的基础上--登录成功后的操作

6.1查询所有信息

6.1.1BooksDao--查询全部

//查询所有的图书信息
    public List<Books> selectAll(){
        List<Books> list = new ArrayList<>();
        try {
            getConn();
            String sql = "select * from books";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                Books books = new Books();
                books.setBook_id(resultSet.getInt("book_id"));
                books.setBook_name(resultSet.getString("book_name"));
                books.setAuthor(resultSet.getString("author"));
                books.setPrice(resultSet.getInt("price"));
                books.setPublisher(resultSet.getString("publisher"));
                books.setType_id(resultSet.getString("type_id"));
                list.add(books);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return list;
    }

6.1.2Unit单元测试

    //查询全部图书信息的单元测试
    @Test
    public void selectAll(){
        List<Books> list = booksDao.selectAll();
        for(Books books:list){
            System.out.println(books.getBook_name()+books.getPrice());
        }
    }

6.1.3login_success--有增删改操作的按钮选择(其他操作最后都跳转的页面)

 <center>成功登录!<input type="button" value="添加" onclick="location.href='add.jsp'"/></center>
    <table border="2" cellpadding="0" cellspacing="0" width="80%" align="center" valign="center" bgcolor="#faebd7">
        <%
            request.setCharacterEncoding("utf-8");
            BooksDao booksDao = new BooksDao();
            List<Books> list = booksDao.selectAll();
            out.print("<tr><th>图书编号</th><th>图书类型编号</th><th>书名</th><th>作者</th><th>出版社</th><th>价格</th><th>操作</th></tr><br>");
            for (Books books:list){
                out.print("<tr>");
                out.print("<td>"+books.getBook_id()+"</td>");
                out.print("<td>"+books.getType_id()+"</td>");
                out.print("<td>"+books.getBook_name()+"</td>");
                out.print("<td>"+books.getAuthor()+"</td>");
                out.print("<td>"+books.getPublisher()+"</td>");
                out.print("<td>"+books.getPrice()+"</td>");
                out.print("<td>" +
                        "<input type=\"button\" value=\"修改\" onclick=\"location.href='update.jsp?book_id="+books.getBook_id()+"'\"/>\t" +
                        "<input type=\"button\" value=\"删除\" onclick=\"location.href='delDo.jsp?book_id="+books.getBook_id()+"'\"/>" +
                        "</td>");
                out.print("</tr>");
            }
        %>
    </table>

6.2添加功能

6.2.1login_success.jsp--添加按钮

6.2.2add.jsp--添加页面

<h3>添加图书信息</h3>
<form action="addDo.jsp" method="post">
    类型编号:<input type="text" name="type_id"/><br>
    书&emsp;&emsp;名:<input type="text" name="book_name" required/><br>
    作&emsp;&emsp;者:<input type="text" name="author"/><br>
    出 版 社 :<input type="text" name="publisher"/><br>
    价&emsp;&emsp;格:<input type="number" name="price" required/><br>
    <input type="submit" value="确认添加"/>
</form>

6.2.3BooksDao--添加方法

 //添加图书操作
    public int add(String type_id,String book_name,String author,String publisher,String price){
        String sql = "insert into books(book_id,type_id,book_name,author,publisher,price) values(null,?,?,?,?,?)";
        return edit(sql,type_id,book_name,author,publisher,price);
    }

6.2.4unit单元测试

//添加图书信息的单元测试
    @Test
    public void add(){
        booksDao.add("ABC","Java面向对象","王佳瑶","AAA出版社","60");
    }

6.2.5addDao.jsp--添加处理页面

<%
    request.setCharacterEncoding("utf-8");//编码设置
    //接收参数
    String type_id = request.getParameter("type_id");
    String book_name = request.getParameter("book_name");
    String author = request.getParameter("author");
    String publisher = request.getParameter("publisher");
    String price = request.getParameter("price");
    BooksDao booksDao = new BooksDao();
    booksDao.add(type_id,book_name,author,publisher,price);//Integer  Double
    response.sendRedirect("login_success.jsp");//跳转
%>

6.3删除操作

6.3.1login_success.jsp--删除按钮

也可:

6.3.2BooksDao--删除方法

//删除图书,根据图书id
    public int delete(String book_id){
        String sql = "delete from books where book_id = ?";
        return edit(sql,book_id);
    }

6.3.3unit单元测试

 //删除图书信息的单元测试
    @Test
    public void del(){
        booksDao.delete("1");
    }

6.3.4delDo.jsp--删除处理页面

<%
    BooksDao booksDao = new BooksDao();
    //接受参数
    String book_id = request.getParameter("book_id");
    int delete = booksDao.delete(book_id);
    if (delete >0) {
        out.print("<script>" +
                "alert('删除成功!');" +
                "location.href='login_success.jsp'</script>");
    }else {
        out.print("<script>" +
                "alert('删除失败');" +
                "location.href='login_success.jsp'" +
                "</script>");
    }

    /*response.sendRedirect("login_success.jsp");//跳转*/
%>

6.4修改操作

6.4.1数据回显①-②-③

6.4.1.2login_success.jsp修改按钮

6.4.1.3BooksDao--根据书id查找的方法
//查询图书的信息--根据id
    public Books selectById(String book_id){
       Books books = null;
        try {
            getConn();
            String sql = "select * from books where book_id = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setObject(1,book_id);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                books = new Books();
                books.setBook_id(resultSet.getInt("book_id"));
                books.setBook_name(resultSet.getString("book_name"));
                books.setAuthor(resultSet.getString("author"));
                books.setPrice(resultSet.getInt("price"));
                books.setPublisher(resultSet.getString("publisher"));
                books.setType_id(resultSet.getString("type_id"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return books;
    }
6.4.1.4unit单元测试
//查询图书信息(根据图书id)的单元测试
    @Test
    public void selectByBooksId(){
        Books books = booksDao.selectById("109104");
        System.out.println(books.getBook_name()+books.getPrice());
    }
6.4.1.5update.jsp--修改页面
<h3>修改学生信息</h3>
<%
    BooksDao booksDao = new BooksDao();
    String book_id = request.getParameter("book_id");//接收传递的值
    Books books = booksDao.selectById(book_id);//调用booksDao的方法,根据book_id查询书籍信息
%>
<%--显示书籍信息--%>
<form action="updateDo.jsp" method="post">
    图书编号:<input type="hidden" name="book_id" value="<%=books.getBook_id()%>"/><br>
    类型编号:<input type="text" name="type_id" value="<%=books.getType_id()%>"/><br>
    书&emsp;&emsp;名:<input type="text" name="book_name" value="<%=books.getBook_name()%>"/><br>
    作&emsp;&emsp;者:<input type="text" name="author" value="<%=books.getAuthor()%>"/><br>
    出 版 社 :<input type="text" name="publisher" value="<%=books.getPublisher()%>"/><br>
    价&emsp;&emsp;格:<input type="number" name="price" value="<%=books.getPrice()%>"/><br>
    <input type="submit" value="确认修改"/>
</form>

6.4.2确认修改④-⑤-⑥

6.4.2.1BooksDao--修改方法
//修改图书操作
    public int update(String book_id,String type_id,String book_name,String author,String publisher,String price){
        String sql = "update books set type_id = ?,book_name = ?,author = ?,publisher = ?,price = ? where book_id = ?";
        return edit(sql,type_id,book_name,author,publisher,price,book_id);
    }
6.4.2.2upadteDo.jsp--修改处理页面
<%
    request.setCharacterEncoding("utf-8");//设置编码
    //接收修改表单提交的数据
    String book_id = request.getParameter("book_id");
    String type_id = request.getParameter("type_id");
    String bookName = request.getParameter("book_name");
    String author = request.getParameter("author");
    String publisher = request.getParameter("publisher");
    String price = request.getParameter("price");
    //调用booksDao里面的修改方法
    BooksDao booksDao = new BooksDao();
    booksDao.update(book_id,type_id,bookName,author,publisher,price);
    //跳转
    response.sendRedirect("login_success.jsp");
%>
6.4.2.3unit单元测试
 //修改图书信息的单元测试
    @Test
    public void update(){
        booksDao.update("7","ACV","高等数学","王佳瑶","AA","71");
    }

7.session会话对象

思考: 我们可以看到登录后需要在其他页面获取当前登录者的信息,而且如果不登陆无法访问其他页面。

如何判断用户是否登录以及如何拿到当前登录者的信息?

如果我们登录成功后需要把当前登录者的信息保存到一个容器中。 在其他网页中从容器中获取用户信息【默认过30分钟没有操作页面 自动关闭】。---该容器就是session会话对象。

7.1什么是session?

session对象表示浏览器与服务器交互的一个容器,该容器用于存放当前会话(登录者)的信息。

session容器中内容保存周期默认为30分钟,获取浏览器关闭。

session中常用的方法有:

setAttribute(key,value);--往session会话中保存信息

getAttribute(key);--从session会话中获取指定的信息

removerAttribute(key);--从session会话中移除指定的信息

7.1.1获取session会话对象信息

eg:获取当前用户信息并实现用户名称

1.修改登录处理页面loginDo.jsp

2.login_success.jsp成功页面

如果没有登录不允许访问其他网页

7.1.2移除session会话对象的信息

login_success.jsp

loginOutDo.jsp

8.JSP中九大内置对象

内置对象就是无需自己在JSP中创建该类的对象。

总共9个内置对象。

1.out输出对象

print()-- 输出方法

2.request:请求对象

getParamenter("参数名") -- 接收请求的参数

setCharacterEncoding("编码")-- 设置编码

getParamenterValues("")-- 接收数组参数值

getRemoteAddr()-- 获取远程访问者的ip地址

getContextPath()-- 获取上下文路径

3.response:响应对象

sendRedirect("路径")-- 重定向到指定路径

4.session:会话对象

setAttribute(key,value)-- 往session会话中保存信息

getAttribute(key)-- 从session会话中获取指定的信息

removeAttribute(key)-- 从session会话中移除指定的信息

5.page:网页对象--每个网页都有一个page对象类似于this对象

6.pageContext:网页上下文对象,该对象都可以获取其他8个对象

setAttribute(key,value)-- 往session会话中保存信息

getAttribute(key)-- 从session会话中获取指定的信息

removeAttribute(key)-- 从session会话中移除指定的信息

7.config:配置对象--获取网页一些相关的配置

8.exception:异常对象Throwable--它只能在错误页面使用

9.application:它是应用对象,里面保存的数据整个服务器都有效,只要服务器不重启。

setAttribute(key,value)-- 往session会话中保存信息

getAttribute(key)-- 从session会话中获取指定的信息

removeAttribute(key)-- 从session会话中移除指定的信息

一定有属于的类型:

9.页面跳转

1.重定向跳转(告诉你地址让你自己连接):redirect

response.sendRedirect("地址");

发送了两次请求,地址栏上的地址最后的请求地址

2.请求转发跳转(直接帮助连接):forward

request.getRequestDispatcher("地址").forward(request,response);

发送了一次请求,地址栏没有改变

10.四大域对象

这四个对象可以存放内容,但是他们的有效期不同。

pageContext对象: 有效期当前页面有效(本页面)

request请求对象: 有效期同一个请求有效(重定向--非一个请求)

session会话对象: 有效期同一个会话有效

application应用对象: 有效期同一个应用【服务器不重启】

有效期越长越占用内存资源。 后期使用最多的是request和session.

session使用再保存当前用户信息

request:只能再转发的页面使用

<h1>通过四大域对象调用get方法获取响应域中数据</h1>

pageContext:<%=pageContext.getAttribute("k1")%><br>

request:<%=request.getAttribute("k1")%><br>

session:<%=session.getAttribute("k1")%><br>

application:<%=application.getAttribute("k1")%><br>

<h1>通过EL表达式获取四大域数据--完整语法: ${scope.key} 获取指定域中保存的数据</h1>

pageContext:${pageScope.k1}<br>

request:${requestScope.k1}<br>

session:${sessionScope.k1}<br>

application:${applicationScope.k1}<br>

<h1>简写的ELl表达式--${key} 默认从PageContext扫描,如果找到对应的key则不会扫描了。扫描request对象中不存在,继续扫描session。 从上到下访问,如果访问到就不往下访问</h1>

${k1}

11. JSTL标签库:核心标签库和格式化标签。

[1]依赖jar加入

[2]网页头部引入标签库的地址。

[3] <c:if test="条件"></c:if>结合EL表达式

<c:choose>

<c:when test="条件">html标签</c:when>

....

<c:otherwise></c:otherwise>

</c:choose>

<c:forEach items="集合或数组" var="变量">

</c:forEach>

<c:redirect url="地址"/>

<f:formatDate value="数据" pattern="格式结构"/>

12. Servlet--java类,承上启下作用。接受页面提交的数据响应到客户(存放的就是之前数据处理的页面)

[1]定义类并继承HttpServlet

[2]重写service方法--[doGet和doPost()]

[3]servlet注册到tommcat上。

第一种: web.xml中注册。

<servlet>

<servlet-name>名称</servlet-name>

<servlet-class>servlet的全路径</servlet>

</servlet>

<servlet-mapping>

<servlet-name>名称</servlet-name>

<url-pattern>/路径名</url-pattern>

</servlet-mapping>

第二种: @WebServlet(name="名称",urlPatterns={"/路径","/路径"})

13.一个Servlet可以处理多个请求

通过作业看到,每个请求都创建了一个Servlet,未来的请求很多的,如果这样操作创建的servlet非常多。正常情况一个表的操作都放在一个servlet中。例如: student表的操作应该放在StudentServlet统一处理。

------把请求放在一个里面统一处理

发现: Servlet中只有一个方法service方法。如何处理多个请求?

发送请求时传递一个标志参数。

一张表的操作:对应一个servlet。------- 存放的就是之前数据处理的页面(增删改查等)用户看不到的内容

14.servlet的生命周期

servlet对象从创建到销毁经历哪些阶段和对应的方法?

1.创建new--只会执行一次

3.初始化阶段--只会执行一次

4.服务阶段--每次请求时(多次)

5.销毁阶段--服务器关闭时

 <!--全局参数-->
    <context-param>
        <param-name>address</param-name>
        <param-value>北京</param-value>
    </context-param>
    <!--创建-->
    <servlet>
        <servlet-name>my</servlet-name>
        <servlet-class>servlet.MainServlet</servlet-class>
        <!--初始化的参数-->
        <init-param>
            <param-name>name</param-name>
            <param-value>wjy</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>18</param-value>
        </init-param>
        <!--服务器启动时加载该servlet:
            优点:客户访问速度快
            缺点:服务器启动慢
            在真正开发中推荐使用-提高用户使用感-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--映射到-->
    <servlet-mapping>
        <servlet-name>my</servlet-name>
        <url-pattern>/mysss</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>w.jsp</welcome-file>
    </welcome-file-list>
public class MainServlet extends HttpServlet {
   //只执行一次。--单例模式(节省内存)
    public MainServlet(){
        //创建servlet经历的方法
        System.out.println("构造servlet方法");
    }
    //初始化方法只执行一次
    @Override
    public void init(ServletConfig config) throws ServletException {
        //本servlet局部参数
        String name = config.getInitParameter("name");
        String age = config.getInitParameter("age");
        //获取全局web参数
        String address = config.getServletContext().getInitParameter("address");
        System.out.println("初始化阶段:"+name+age+address);
    }
    //每次请求都会经过service服务阶段

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("服务阶段");
    }
    //销毁阶段
    @Override
    public void destroy() {
        System.out.println("销毁阶段");
    }

15.jsp+servlet+jstl+el标签完成操作--页面之间的跳转

15.1登录-查询

verify.jsp

LoginServlet

success.jsp

15.2删除

success.jsp

MainServlet

重新加载

15.3添加

success.jsp

addBooks.jsp

重新加载

15.4编辑--修改

4.1数据回显

-- 先根据id去查找到所属信息(跳到servlet中)

--(servlet中调用dao方法)把信息存到request中

---跳转到修改.jsp页面(输入信息位置获取存储的值)

--发送给servlet调用dao中的修改方法

--修改成功跳转到有显示数据信息的页面

success.jsp

MainServlet

数据回显

updateBooks.jsp

MainServlet.jsp

重新加载

15.5退出

success.jsp

LoginServlet

16.过滤器

package com.wjy.filter;

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

/**
 * @program: servlet_crud_jsp_el
 * @description: 过滤器
 * @author: 王佳瑶
 * @create: 2024-05-11 08:57
 **/
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //System.out.println("初始化过滤器");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //哪些资源允许匿名访问 verify.jsp页面  LoginServlet处理接口 enroll.jsp注册页面  注册的处理接口  图片  css  js
        //1.获取请求路径
        String path = request.getServletPath();
        //打印查看路径是否书写正确
        //System.out.println(path+"~~~~~~~~~~~~");
        if ("/verify.jsp".equals(path) ||
            "/enroll.jsp".equals(path) ||
                "/my".equals(path) ||
                path.endsWith(".jpg") ||
                path.endsWith(".gif") ||
                path.endsWith(".png") ||
                path.endsWith(".css") ||
                path.endsWith(".js")
        ) {
            //放行
            filterChain.doFilter(request,response);
            return;
        }

        //登录成功的用户
        HttpSession session = request.getSession();
        Object users = session.getAttribute("users");
        if(users!=null){ //访问者登录成功过
            //放行
            filterChain.doFilter(request,response);
            return;
        }

        //跳转到verify.jsp
        response.sendRedirect("/verify.jsp");
    }

    @Override
    public void destroy() {
        //System.out.println("销毁过滤器");
    }
}
package com.wjy.filter;

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

/**
 * @program: servlet_crud_jsp_el
 * @description: 编码设置过滤器
 * @author: 王佳瑶
 * @create: 2024-05-11 15:00
 **/
public class EncodingFilter implements Filter {

    private String encod = "gbk";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化时只会执行一次
        //获取到初始化的值给全局变量--做到好修改,不改变源码
        encod = filterConfig.getInitParameter("encoding");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //设置编码
        servletRequest.setCharacterEncoding(encod);
        servletResponse.setCharacterEncoding(encod);
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

Ajax

1.什么是Ajax(Asynchronous JavaScript and XML)?

客户端发送请求后,而我们的服务端响应一个页面|地址。

Ajax响应的不在是地址或网页,而是一个数据。

允许与服务器通信而无须刷当前页面的技术。

使用Ajax必须具备的条件:(js+css功底)

1.通过事件触发向服务器发送请求

2.服务器响应的一定是数据,不再是地址或网页

2.如何完成Ajax?

  1. 可以通过js完成原生的Ajax请求----javascript
  2. 可以使用jquery实现Ajax请求-----别人封装原生js发送的Ajax。

$.get(url,data,callback,type);

$.post(url,data,callback,type);

1.url:服务器的地址

2.data:发送Ajax请求时携带的数据

3.callback:回调函数---当服务器响应时会触发该函数

4.type:服务器响应的数据类型。默认text、json

步骤:

1.引入jquery文件(在web目录下js文件下)

<script src="js/jquery-3.5.1.min.js"></script>

2.通过事件向服务器发送请求

 <body>
      <button onclick="myclick()">点击事件</button>
      <%=new Date()%>
      <span id="r"></span>
  </body>

   <script>
      function myclick() {
           // AjaxServlet服务器的地址
           // {key:value,key:value.....}
           // 回调函数: 当服务器响应后触发的函数  msg:服务器响应的数据赋值给该变量
            $.get("/AjaxServlet",{name:"zs",age:25},function(msg){
                   document.getElementById("r").innerHTML=msg
                   // $("#r").html(msg)
            });
      }
   </script>
@WebServlet(urlPatterns = "/AjaxServlet")
public class AjaxServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受参数
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        //业务操作---

        //获取输出对象
        PrintWriter out = resp.getWriter();
        //响应数据---
        out.print("~~~~~~~~~~~~~~~~~~~~~~ajax ------data~~~~~~~~~~~~~~~");

        //刷新和关闭out对象
        out.flush();
        out.close();
    }
}

3.Ajax服务器响应的数据类型?

  1. text:文本类型--默认就是文本类型
  2. json: json对象类型---非常重要
  3. xml: xml类型---人工智能,微信支付。【了解】
  4. 什么是json以及格式?

JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。

//json对象

{"key":value,"key":value...}

//json集合--可嵌套

[

{"key":value,"key":value...},

{"key":value,"key":value...},

....

]

元素值可具有的类型:string, number, object, array, true, false, null

调用json对象中数据: 对象名.key

4.通过Ajax完成crud操作。

4.1登录+显示信息

verify.jsp

LoginServlet

success.jsp

MainServlet

success.jsp----回调函数json给msg

4.2删除

success.jsp

MainServlet

过滤器和之前相同

5.总结

Ajax异步请求:

js事件通过Ajax向服务器发送请求,而服务器给js事件相对应的数据

Ajax步骤:Jquery完成

【1】一定引入jquery文件

【2】通过事件发送Ajax请求:$.get(url,[data],[callback],[type])

;