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>
书  名:<input type="text" name="book_name" required/><br>
作  者:<input type="text" name="author"/><br>
出 版 社 :<input type="text" name="publisher"/><br>
价  格:<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>
书  名:<input type="text" name="book_name" value="<%=books.getBook_name()%>"/><br>
作  者:<input type="text" name="author" value="<%=books.getAuthor()%>"/><br>
出 版 社 :<input type="text" name="publisher" value="<%=books.getPublisher()%>"/><br>
价  格:<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?
- 可以通过js完成原生的Ajax请求----javascript
- 可以使用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服务器响应的数据类型?
- text:文本类型--默认就是文本类型
- json: json对象类型---非常重要
- xml: xml类型---人工智能,微信支付。【了解】
- 什么是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])