6.Servlet

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值