6.Servlet(Sun公司开发动态web的技术)
servlet是他们提供的一个接口
有两个默认的类给你继承
public abstract class HttpServlet extends GenericServlet
开发servlet程序需要两点:
1.编写一个类实现接口
2.把这个类部署到web服务器
那个java程序就是servlet了
1.构建一个maven项目
1.空白maven只可以删除src
以后就在这里建立moudel,这个工程就是maven的主工程
放依赖,放入servlet和jsp的api maven文件
(记得删除作用域provided)
2.maven子工程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UWLcIHO1-1617466824327)(C:\Users\Jc、Sunday\AppData\Roaming\Typora\typora-user-images\image-20201222215049346.png)]
子模块:
<parent>
<artifactId>JavaWeb-02-empty</artifactId>
<groupId>com.Charles</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父亲模块:
<groupId>com.Charles</groupId>
<artifactId>JavaWeb-02-empty</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>servlet-01</module>
</modules>
父项目的java子项目可以使用
3.maven环境优化
在web.inf的xml文件里面替换tomcat的xml文件
<?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"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
4.编写一个servlet程序
1.写一个普通类
2.实现servlet接口,继承别人的类
重写httpservlet的方法doget和dopost,写一个映射
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oeSl5agm-1617466824330)(image-20201222225101392.png)]
//get和post本质实现的东西是一样的,只是请求实现的方式不一样,可以相互调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
//输出流(输入流同理)
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter();
writer.write("Hello");
//实际上我们用println,ln自动换行不会阻塞他的IO流
writer.println("world");
5.为什么要写servlet的映射
浏览器需要在本地的web服务器里面访问一个路径,这个路径是我们写的servlet的java程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4HLhmCX-1617466824331)(2018120522281643.gif)]
在web.xml注册的servlet和servlet-mapping
<!--注册一个servlet-->
<servlet>
<servlet-name>Charles</servlet-name>
<servlet-class>com.Charles.Servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Charles</servlet-name>
<url-pattern>Charles</url-pattern>
</servlet-mapping>
6.配置TomCat
配置tomcat路径(右手就行)
只有进入该路径才能访问这个网页
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y1mZLY25-1617466824333)(image-20210319224558519.png)]
运行服务器(成功)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4j4mdsoa-1617466824335)(image-20201222233645495.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jcBU33ee-1617466824336)(image-20201223000056746.png)]
6.3Servlet原理
web服务器调用servlet,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-os60TR5A-1617466824338)(image-20210319232935545.png)]
idea的servlet-mapping
是一个映射的路径,可以一对一,可以一对多[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rOpIyHtB-1617466824339)(image-20210319233226373.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hwH0CjTA-1617466824339)(image-20210319233817123.png)]
mapping之中通配符/*没有指定的路径优先级高,一些没有指定路径的可以走error不走普通404
6.4servletContext(servlet中间商)(servlet笔试)
web容器启动的时候,它会为每个webapp创建一个对应的context对象,代表当前的web应用。
应用:
#共享数据,IO通信(context通信)
servlet数据间共享
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A9SyjTqb-1617466824340)(image-20210320162929848.png)]
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//context读取
ServletContext context = this.getServletContext();
String str =(String) context.getAttribute("user");
//resp.setContentType("text/html");
//resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("user: "+str);
}
注意没有调用存取的时候取出来是null;要先调用context存进去才能取出来
要有先放数据的java类,再有一个拿数据的,再有web.xml里面的servlet;
#获取初始化参数
在web.xml里面写参数,在java类里面可以获取context.getInitparameter
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pwjzZjTO-1617466824341)(image-20210320165234910.png)]
#请求转发(重要)转发servlet的mapping
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//context读取
ServletContext context = this.getServletContext();
//转发地址
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径
//requestDispatcher.forward(req,resp);//调用forward实现请求转发
context.getRequestDispatcher("/gp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UOUP8Ux6-1617466824342)(image-20210320170010462.png)]
作用是context通过getdispatcher转到哪个web页面,但是路径不变,后面的重定向会变。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0DuwUNF-1617466824344)(image-20210320170435568.png)]
#读取资源文件properties
在java里面的properties如果没有在pom.xml里面说明就没办法写入target中
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(resourceAsStream);
String user = prop.getProperty("user");
String password = prop.getProperty("password");
resp.getWriter().print(user);
resp.getWriter().print(password);
}
用流加载一个properties路径,再new一个properties文件,把流传进去,,再输出properties的内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3t2wevcY-1617466824345)(image-20210320173002212.png)]
6.7HttpResponse(重点)
web服务器针对服务请求 分别创建一个代表请求的request和回应的response对象。
#响应消息给浏览器发送消息,(input,outputstream)
响应体:消息头,消息体。响应的状态码404,502,3xx。
应用:
#1.下载文件(流的操作要记住)
//1.要下载的文件路径
String realPath = "D:\\webStudy\\Response\\src\\main\\resources\\mat.png";
System.out.println("realpath:" + realPath);
//2.要下载的文件名字
String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3.让浏览器支持下载的东西
resp.setHeader("Content-disposition","attachment;filename"+filename);
//获取下载文件的输入流
FileInputStream inputStream = new FileInputStream(realPath);
//4.创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//获取输出流的对象
ServletOutputStream outputStream = resp.getOutputStream();
//把fileoutputstream放入buffer缓冲区
while ((len=inputStream.read(buffer)) !=-1) {
outputStream.write(buffer, 0, len);
}
//关闭流
inputStream.close();
outputStream.close();
熟记背诵↑
#验证码功能:
需要一个图片类
保证生成的string一定是8位数的
//辅助函数
//生成随机数
private String makeNum(){
Random random = new Random();
String s=random.nextInt(99999999)+"";//多少位数
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 8-s.length(); i++) {
sb.append("0");
}
s=sb.toString()+s;
return s;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让浏览器5s刷新一次
resp.setHeader("refresh","5");
//在内存中创建一个图片需要,bufferImage类
BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片,写入图片
Graphics2D g = (Graphics2D)bufferedImage.getGraphics();//笔
//设置背景
g.setColor(Color.WHITE);
g.fillRect(0,0,80,20);
//图片pen写数据
g.setColor(Color.BLUE);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(makeNum(),0,20);
//告诉浏览器请求方式为图片,很重要
resp.setContentType("image/jpeg");
//网站有缓存,设置定时刷新
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("pragma","no-cache");
//让浏览器获取图
ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
}
#实现重定向
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RDItkxTJ-1617466824346)(file://D:/book/image-20210320170435568.png?lastModify=1616249885)]
简介::一个web资源收到客户端请求,通知客户端去请求另一个web资源
常见于,微信登录跳转等
直接重定向无法定位到tomcat的指定目录
//发送重定向
resp.sendRedirect("/image");
这样才可以,此时状态码为302重定向
//发送重定向
resp.sendRedirect("/s/image");
面试题,重定向和转发的区别
相同点:
指定页面跳转
不同点:
请求转发时url不发生变化
重定向url会变化
6.6HttpRequest
用处:
<!--以post表单提交,这里和前面的不一样,不会在导航栏目显示信息-->
<form action="${pageContext.request.contextPath}/login"method="post">
user:<input type="text" name="username"><br>
pass:<input type="password" name="password"><br>
爱hao:
<input type="checkbox" name="hobby" value="n">
<input type="checkbox" name="hobby" value="x">
<input type="checkbox" name="hobby" value="xc.">
<input type="checkbox" name="hobby" value="s">
<input type="submit">
</form>
1.getparameter(),获取前端参数
2.请求转发
//通过请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
3.重定向(注意路径)
index.jsp到submit到/login(request)到success.jsp
//写服务器根目录
resp.sendRedirect("/s/success.jsp");
<html>
<body>
<h2>Hello World!</h2>
<%--${pageContext.request.contextPath}/login 当前项目下的login目录--%>
<form action="${pageContext.request.contextPath}/login " method="get">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KyPVlOLz-1617466824347)(image-20210320224405837.png)]
客户端请求后,HttpRequest就会getparameter收到所有的信息,可以用于函数和数据库使用。
7.Cookie, Session
7.1会话
用户打开浏览器,点开链接,访问资源的过程,叫做会话。
有状态会话:证明一个客户端曾经访问过服务器
一个网站,怎么证明你来过
客户端 服务端
1.首次访问cookie←,下次客户端带上cookie就能访问服务端
2.服务器登记你来过,下次来的时候服务器匹配你:session
7.2保存会话的技术
cookie(客户端)(req请求request,resp响应response)
//从服务器request拿到这个cookie
Cookie[] cookies = req.getCookies();//返回数组说明有多个cookie
cookie.getName;
cookie.getValue
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
//服务器告诉你你什么时候来,你把时间封装成cookie,你下次拿着这个cookie来
//先解决乱码
req.setCharacterEncoding("GBK");
resp.setCharacterEncoding("GBK");
PrintWriter out = resp.getWriter();
//从服务器request拿到这个cookie
Cookie[] cookies = req.getCookies();//返回数组说明有多个cookie
//判断cookies是否存在,是不是空,第一次来就是空
if(cookies!=null){
//遍历一下
out.write("上一次访问时间");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}
else {
out.write("第一次访问");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
cookie有没有上限?
浏览器一般有三百个上限,每个站点一般20个,大小一般4kb
怎么删除?
不设置有效期,或者设置一个同名的cookie有效期为0
编码错误可以用URLendcor和decor编码解码
session(服务端)(保存客户端会话,把信息放在session)
常见:网站登录后第二次访问不用登录了,这就是cookie应用
应用与查询最近的登录时间,浏览器关了会话关闭访问时间会重置,除非是设置了cookie的存在时间maxage,但是不安全
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxwCUPmD-1617466824348)(image-20210321151400071.png)]
seesion会话(重点)
#服务器会给每个用户(浏览器)创建一个session对象,
#只要浏览器不关,这个session就存在
#应用用户登录后整个网站都能访问,保存购物车的信息,在整个网站中经常会使用的数据,我们将它保存在session中
//申请session对象
HttpSession session = req.getSession();
//存东西
session.setAttribute("name","charles");
//获取id
String id = session.getId();
//判断session是不是新的
if(session.isNew()){
resp.getWriter().write("session创建成功,id="+id);
}else {
resp.getWriter().write("session已经存在,id="+id);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Au5Q4VFs-1617466824349)(image-20210321214934869.png)]
//申请session对象
HttpSession session = req.getSession();
//注销
session.removeAttribute("name");
session.invalidate();
会话session自动过期
<!--session的配置,失效时间-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
seesion和cookie的区别:
#cookie是把用户的数据写给浏览器,
#Session是写到用户独占的session,服务器保存(保存重要信息,减少资源浪费)
#写不写session它都存在于cookie,seesion由服务创建
cookie,给的是资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gErw0a6-1617466824350)(image-20210321222322173.png)]
session,给的是钥匙,一个随开随走权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rW1uTtGa-1617466824351)(image-20210321222453608.png)]
8.JSP
java servlet pages,服务器端页面,动态web
jsp可以嵌入java代码,给用户提供动态数据
原理:浏览器访问服务器都是访问servlet
jsp转换成了class文件,jsp本质上是servlet**
C:\Users\Jc、Sunday.IntelliJIdea2019.3\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\javaweb_session_cookie_war\org\apache\jsp[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZfS8mQ7M-1617466824353)(image-20210321223846771.png)]
1.判断请求
2.内置了一些对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-klL3S2sS-1617466824354)(image-20210321233433339.png)]
在jsp中,
java代码会原封不动输出out.print
<%
String name ="Charles";
%>>
name: <%=name%>
html代码会转化为out.write
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2T9BPvEZ-1617466824355)(image-20210321233831890.png)]
JSP基础语法和指令
<!--JSTL表达式的依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--standard标签库-->
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
java的技术应用,知道就行,java的语法都支持;
1.JSP表达式
<!--JSP表达式
用来将程序输出
输出变量或者表达式,Sout
-->
<%= new java.util.Date()%>
<!--JSP脚本
-->
<%
int sum=0;
for (int i = 0; i <=99 ; i++) {
sum+=i
}
out.print(sum);
%>
2.JSP脚本片段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JR2rRlZJ-1617466824356)(image-20210322145617782.png)]
3JSP声明,在service外部写一个函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hVYr5JPh-1617466824357)(image-20210322150101336.png)]
EL表达式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hSlIpQ61-1617466824358)(image-20210322150327575.png)]
2.JSP指令
#定制错误页面
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3A1Fm8x-1617466824359)(image-20210322153011266.png)]
#定制特定的头
<%@include file="../common/header.jsp"%>
<%@include file="../common/footer.jsp"%>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKx1cSs5-1617466824361)(image-20210322153407259.png)]
webinf下的文件对用户不可见
4.九大内置对象
pagecontext,存
request,存
response,
session,存
application,存
config(servlet config),
out ,
page ,
exception
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AG40VwaE-1617466824362)(image-20210322164842297.png)]
作用时间不一样
用途不一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CV2kg6tU-1617466824363)(image-20210322233258250.png)]
5.JSP标签,
jstl表达式:
为了弥补html的不足
EL表达式:${}
要导入两个包
写数据。获取数据
<jsp:forward page="/JSPTag2.jsp">
<jsp:param name="value1" value="value12"></jsp:param>
<jsp:param name="value2" value="value22"></jsp:param>
</jsp:forward>
<%--取出参数--%>
name<%=request.getParameter("value1")%>
age<%=request.getParameter("value2")%>
<%--引入JSTL核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
用来使用语言的代码
JSTL标签库
引入对应的taglib,才能使用他的代码方法,网上有
有时候tomcat也需要引入这个两个jar包,因为work空间的问题
<%--引入JSTL核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
if-else
<form action="coreif.jsp" ,method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="login">
</form>
<%--判断是不是管理员--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="welcome"></c:out>
</c:if>
<c:out value=" ${isAdmin}"></c:out>
<c:set var="score" value="88"/>
<c:choose>
<c:when test="${score>=90}">
优秀
</c:when>
<c:when test="${score>=80}">
一般
</c:when>
<c:when test="${score>=70}">
合格
</c:when>
<c:when test="${score>=60}">
emmm
</c:when>
</c:choose>
遍历
<%
ArrayList<String> people = new ArrayList<String>();
people.add(0, "zhangsan");
people.add(1, "zhangn");
people.add(2, "zhsan");
people.add(3, "angsan");
request.setAttribute("list", people);
%>
<c:forEach var="people" items="${list}" >
<c:out value="${people}"/><br>
</c:forEach>
JSTK,
EL表达式
在jsp页面中使用了el表达式但却无法识别,页面会将表达式原封不动的显示出来还是${…}的样子。
只要在jsp页面加入下面这句就可以解决了。
<%@page isELIgnored=“false”%>
6.JavaBean
是一个实体类,
#要有一个无参构造,
#属性要私有化
用途是与数据库 的数据做映射ORM
对象关系映射
表-》类
字段-》属性
行记录-》对象
7.mvc三层架构
model ,view ,controller
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgvPXrqu-1617466824365)(image-20210323230222244.png)]
现在使用的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5EYfsfx6-1617466824366)(image-20210325124338015.png)]
Model:
1业务处理(service)
2CRUD(Dao)
View:
1展示数据
2提供链接发起servlet请求
Controller(servlet)
1.request请求
2.交给业务层处理代码
3.控制视图跳转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQ34VKlO-1617466824367)(image-20210325130311493.png)]
pom.xml
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--数据库上传要用mysql connector的包-->
</dependencies>
9.Filter
拿来就用,过略数据,减少代码。
#处理乱码
#登录验证
1.导包
2.编写java
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncoder implements Filter
需要重写三个函数
//初始化
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
//do
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("up");
//链拦截,向下转交,固定代码
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("down");
}
//销毁
public void destroy() {
System.out.println("destroy");
}
写完配置filter
web(所以路径要规范,不然会出错)
<filter>
<filter-name>charset</filter-name>
<filter-class>com.charles.filter.CharacterEncoder</filter-class>
</filter>
<filter-mapping>
<filter-name>charset</filter-name>
<!--只要是servlet目录下都要经过这个路径-->
<url-pattern>/servlet/*</url-pattern>
<!--或者/admin/*-->
</filter-mapping>
10.监听器
实现监听器的接口
1创建
2在xml注册
作用:
¥关闭窗口,拦截用户
¥用户获取登录权限才能进入主页
GUI里面的监听器应用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KqWCJJZN-1617466824368)(image-20210325144419874.png)]
1.用户登录后才能进入,注销后不能进入
2.需要登陆才能进入主页,在session里面放数据
3.进入主页后在过滤器里面实现用户是否登陆功能
11.JDBC
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5NmC7wv-1617466824369)(image-20210326220711417.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zA2N02OO-1617466824370)(image-20210326220736676.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIFkcNpm-1617466824371)(image-20210326221129896.png)]
事务:锁啊异步问题啊
start transaction ;#begin shiwu
update account set money=money-100 where name="A";
update account set money=money+100 where name="B";
rollback ;
commit ;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nahhcoQU-1617466824372)(image-20210326224435990.png)]
12.Junit测试
import org.junit.Test;
public class testJDBC {
@Test
public void test(){
System.out.println("hello");
}
}
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
s>com.charles.filter.CharacterEncoder
charset
/servlet/*
## 10.监听器
实现监听器的接口
1创建
2在xml注册
作用:
¥关闭窗口,拦截用户
¥用户获取登录权限才能进入主页
GUI里面的监听器应用
[外链图片转存中...(img-KqWCJJZN-1617466824368)]
1.用户登录后才能进入,注销后不能进入
2.需要登陆才能进入主页,在session里面放数据
3.进入主页后在过滤器里面实现用户是否登陆功能
## 11.JDBC
[外链图片转存中...(img-d5NmC7wv-1617466824369)]
[外链图片转存中...(img-zA2N02OO-1617466824370)]
[外链图片转存中...(img-aIFkcNpm-1617466824371)]
事务:锁啊异步问题啊
```sql
start transaction ;#begin shiwu
update account set money=money-100 where name="A";
update account set money=money+100 where name="B";
rollback ;
commit ;
[外链图片转存中…(img-nahhcoQU-1617466824372)]
12.Junit测试
import org.junit.Test;
public class testJDBC {
@Test
public void test(){
System.out.println("hello");
}
}
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>