• JavaWeb知识梳理(后端部分)


    JavaWeb

    静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。

    动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同

    静态web资源开发技术:HTML、CSS、JavaScript。

    动态web资源开发技术:JSP/Servlet、ASP、PHP等。在Java中,动态web资源开发技术统称为Java Web。

    Web服务器

    技术讲解

    ASP:微软,国内最早流行的是ASP,在HTML中嵌入了VB的脚本,ASP+COM,维护成本高。

    PHP:开发速度很快,功能很强大,跨平台,代码简单,但是无法承载大访问量的情况(局限性)。

    JSP/Servlet:sun公司主推的B/S架构,基于java语言,可以承载三高问题(高并发,高可用,高性能)。

    B/S:浏览器和服务器;C/S:客户端和服务器。

    Web服务器

    服务器用来处理用户的一些请求,响应给用户一些数据。

    IIS:微软的,主要用于ASP,Windows中自带的服务器。

    **Tomcat:**Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个JavWeb初学者来说,是最好的选择。

    Tomcat 实际上运行JSP 页面和Servlet。

    Tomcat

    安装Tomcat:官网下载(tomcat.apache.org/)压缩包,解压至指定目…

    在bin目录下点击startup.bat启动,在浏览器网址栏输入localhost:8080测试。

    网站是如何进行访问的:

    • 输入用户名,回车
    • 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件有没有这个域名的映射
      • 有就直接返回对应的ip地址
      • 没有就去DNS(全世界的域名管理)服务器上寻找,找到就返回

    Http

    Http(超文本传输协议):http是一个简单的请求-响应协议,它通常运行在TCP之上。(默认端口:80)

    Https:443

    • Http1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接。
    • Http1.1:客户端可以与web服务器连接后,可以获得多个web资源。

    Http请求

    • 客户端----发请求----服务器

    Http响应

    • 服务器----发请求----客户端

    请求方式:

    get:请求能够携带的参数比较少,大小有限制,会在浏览器地址栏显示参数的内容,不安全,但是高效。

    post:请求能够携带的参数没有限制,大小没有限制,不会再浏览器地址栏显示参数的内容,安全,但不高效。

    响应状态码:

    200:请求响应成功

    3**:请求重定向

    404:找不到资源

    500:服务器代码错误,502:网关错误

    Maven

    Maven:项目架构管理工具,自动导入jar包(约定大于配置)。

    下载Maven后解压,配置环境变量,将bin目录的路径配置到path中,在cmd中输入mvn-version,查看是否配置成功

    在conf目录下setting的 下配置本地仓库

    D:\Environments\apache-maven-3.6.3\maven-repo

    在conf目录下setting的 中配置阿里云的镜像

    pom.xml

    pom.xml:maven的核心配置文件

    由于maven的约定大于配置,我们之后写的配置文件可能无法导出或者无法生效,就需要在maven配置下面配置resouce。

    Servlet

    servlet就是sun公司开发动态web的一门技术,sun公司在API中提供了一个接口叫Servlet,如果需要开发一个Servlet程序,需要编写一个类去实现Servlet接口,再把开发好的java类部署到web服务器中。

    HelloServlet

    sun公司有两个Servlet接口的默认实现类:HttpServlet和GenericServlet

    1. 构建一个maven项目,删除里面的src项目,以后就直接新建model,这个空的工程就是Maven的主工程。

    2. 关于Maven父子工程的理解:

    父项目中会有

    1. <module>servlet-01module>

    子项目中有

    1. javaweb-02-servlet
    2. com.zr
    3. 1.0-SNAPSHOT

    3.Maven环境优化:修改web.xml为最新的,将Maven的结构搭建完整。

    4.编写一个普通类,实现Servlet接口,继承HttpServlet。

    1. public class HelloServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //ServletOutputStream outputStream = resp.getOutputStream();
    5. PrintWriter writer = resp.getWriter(); //响应流
    6. writer.println("Hello Servlet");
    7. }
    8. @Override
    9. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. super.doPost(req, resp);
    11. }
    12. }

    5.编写Servlet的映射:我们写的是java程序,但是要通过浏览器访问,而浏览器要连接web服务器,所以我们要在web服务器注册我们写的Servlet,还需要给它一个浏览器能够访问的路径。

    1. hello
    2. com.zr.servlet.HelloServlet
    3. hello
    4. /hello

    6.配置Tomcat

    7.启动测试

    Servlet原理

    Servlet是由Web服务器调用,web服务器收到请求后,会进行以下操作:

    Mapping

    1. 一个Servlet可以指定一个映射路径

      1. hello
      2. /hello

                                                                                      

    2. 一个Servlet可以指定多个映射路径

    1. hello
    2. /hello
    3. hello
    4. /hello2
    5. hello
    6. /hello3

    3.一个Servlet可以指定通用映射路径

    1. hello
    2. /hello/*

    4.默认请求

    1. hello
    2. /*

    5.一个Servlet可以指定一些后缀或者前缀映射路径

    1. hello
    2. *.zzr

    优先级问题:

    指定了固有的映射路径,优先级最高,找不到就会走默认的处理请求。

    处理404页面

    1. error
    2. com.zr.servlet.ErrorServlet
    3. error
    4. /*

    ServletContext

    web容器在启动的时候,它会为每一个web程序都创建一个ServletContext对象,它代表了当前的 web应用。

    • 共享数据

      我在这个Servle中保存的数据可以在另外一个Servle中拿到

    1. public class HelloServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. System.out.println("hello");
    5. //this.getInitParameter(); 初始化参数
    6. //this.getServletConfig(); Servlet的配置
    7. //this.getServletContext(); Servlet上下文
    8. ServletContext context = this.getServletContext();
    9. String username = "周周";
    10. context.setAttribute("username",username);//将一个数据保存在ServletContext中
    11. }
    12. }
    1. public class GetServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. ServletContext context = this.getServletContext();
    5. String username = (String) context.getAttribute("username");
    6. resp.setCharacterEncoding("utf-8");
    7. resp.setContentType("text/html");
    8. resp.getWriter().println("名字:"+username);
    9. }
    10. @Override
    11. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. }
    13. }
    1. hello
    2. com.zr.servlet.HelloServlet
    3. hello
    4. /hello
    5. get
    6. com.zr.servlet.GetServlet
    7. get
    8. /get

    测试访问结果

    1.获取初始化参数

    1. url
    2. jdbc:mysql://localhost:3306/mybaits
    3. gp
    4. com.zr.servlet.ServletDemo03
    5. gp
    6. /gp
    1. public class ServletDemo03 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. ServletContext context = this.getServletContext();
    5. String url = context.getInitParameter("url");
    6. resp.getWriter().println(url);
    7. }
    8. @Override
    9. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. super.doPost(req, resp);
    11. }
    12. }

    2.请求转发

    1. public class ServletDemo04 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. ServletContext context = this.getServletContext();
    5. RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径
    6. requestDispatcher.forward(req,resp);//转发
    7. }
    8. @Override
    9. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. super.doPost(req, resp);
    11. }
    12. }
    1. sd4
    2. com.zr.servlet.ServletDemo04
    3. sd4
    4. /sd4

    读取资源文件

    properties

    • 在Java目录下新建propreties(需要在pom.xml下配置resources)
    • 在resources目录下新建properties

    发现都被打包到了target下的class目录下,我们称这个路径为类路径classpath。

    1. public class ServletDemo05 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
    5. Properties properties = new Properties();
    6. properties.load(is);
    7. String username = properties.getProperty("username");
    8. String password = properties.getProperty("password");
    9. resp.getWriter().println("username:"+username);
    10. resp.getWriter().println("password:"+password);
    11. }
    12. @Override
    13. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    14. doGet(req, resp);
    15. }
    16. }
    1. sd5
    2. com.zr.servlet.ServletDemo05
    3. sd5
    4. /sd5
    1. src/main/resources
    2. **/*.properties
    3. **/*.xml
    4. true
    5. src/main/java
    6. **/*.properties
    7. **/*.xml
    8. true
    1. //文件 db.properties
    2. username=root
    3. password=123456

    HttpServletResponse

    web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应一个HttpServletResponse。

    • 如果要获取客户端请求过来的参数:HttpServletRequest
    • 如果要给客户端响应一些信息:HttpServletResponse

    简单分类

    负责向浏览器发送数据的方法

    1. ServletOutputStream getOutputStream() throws IOException;
    2. PrintWriter getWriter() throws IOException;

    负责向浏览器发送响应头的方法

    1. void setCharacterEncoding(String var1);
    2. void setContentLength(int var1);
    3. void setContentLengthLong(long var1);
    4. void setContentType(String var1);
    5. void setDateHeader(String var1, long var2);
    6. void addDateHeader(String var1, long var2);
    7. void setHeader(String var1, String var2);
    8. void addHeader(String var1, String var2);
    9. void setIntHeader(String var1, int var2);
    10. void addIntHeader(String var1, int var2);

    响应的状态码

    1. int SC_OK = 200;
    2. ...
    3. int SC_MULTIPLE_CHOICES = 300;
    4. int SC_BAD_REQUEST = 400;
    5. int SC_UNAUTHORIZED = 401;
    6. int SC_PAYMENT_REQUIRED = 402;
    7. int SC_FORBIDDEN = 403;
    8. int SC_NOT_FOUND = 404;
    9. ...
    10. int SC_INTERNAL_SERVER_ERROR = 500;
    11. int SC_BAD_GATEWAY = 502;

    下载文件
    1. 向浏览器输出消息

    2. 下载文件

      1. 获取下载文件的路径
      2. 下载的文件名
      3. 让浏览器支持下载我们需要的东西
      4. 获取下载文件的输入流
      5. 创建缓冲区
      6. 获得OutputStream对象
      7. 将FileOutputStream流写入到buffer缓冲区
      8. 将OutputStream缓冲区中的对象输出到客户端

    1. public class FileServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //1. 获取下载文件的路径
    5. String realPath = "D:\\IDEACode\\javaweb-02-servlet\\response\\src\\main\\resources\\1.PNG";
    6. System.out.println("下载文件的路径:"+realPath);
    7. //2. 下载的文件名
    8. String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
    9. //3. 让浏览器支持下载我们需要的东西
    10. resp.setHeader("Content-Disposition","attachment;filename="+fileName);
    11. //4. 获取下载文件的输入流
    12. FileInputStream in = new FileInputStream(realPath);
    13. //5. 创建缓冲区
    14. int len = 0;
    15. byte[] buffer = new byte[1024];
    16. //6. 获得OutputStream对象
    17. ServletOutputStream out = resp.getOutputStream();
    18. //7. 将FileOutputStream流写入到buffer缓冲区 将OutputStream缓冲区中的对象输出到客户端
    19. while ((len=in.read(buffer))>0){
    20. out.write(buffer,0,len);
    21. }
    22. in.close();
    23. out.close();
    24. }
    25. @Override
    26. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    27. doGet(req, resp);
    28. }
    29. }
    验证码功能

    如何生成验证码:

    • 前端
    • 后端:需要用Java的图片类,生成一个图片
    1. public class ImageServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //让浏览器5秒刷新一次
    5. resp.setHeader("refresh","5");
    6. //创建图片
    7. BufferedImage image = new BufferedImage(300,60,BufferedImage.TYPE_INT_RGB);
    8. //得到图片
    9. Graphics g = image.getGraphics(); //笔
    10. //设置图片的背景颜色
    11. g.setColor(Color.green);
    12. g.fillRect(0,0,300,60);
    13. //给图片写数据
    14. g.setColor(Color.magenta);
    15. g.setFont(new Font(null,Font.BOLD,70));
    16. g.drawString(makeNum(),0,60);
    17. //浏览器以图片的形式打开
    18. resp.setContentType("image/png");
    19. //网站存在缓存。不让浏览器缓存
    20. resp.setDateHeader("expires",-1);
    21. resp.setHeader("Cache-Control","no-cache");
    22. resp.setHeader("Pragma","no-cache");
    23. //把图片显示出来
    24. boolean write = ImageIO.write(image,"jpg",resp.getOutputStream());
    25. }
    26. //生成随机数
    27. private String makeNum(){
    28. Random random = new Random();
    29. String num = random.nextInt(9999999) + "";
    30. StringBuffer sb = new StringBuffer();
    31. for (int i = 0; i < 7-num.length(); i++) {
    32. sb.append("0");
    33. }
    34. num = sb.toString()+num;
    35. return num;
    36. }
    37. @Override
    38. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    39. doGet(req, resp);
    40. }
    41. }
    1. image
    2. com.zr.servlet.ImageServlet
    3. image
    4. /image
    实现重定向
    void sendRedirect(String var1) throws IOException;//重定向
    
    1. public class RedirectServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. /*
    5. resp.setHeader("Location","/r/image");
    6. resp.setStatus(302);
    7. */
    8. resp.sendRedirect("/r/image");
    9. }
    10. @Override
    11. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. doGet(req, resp);
    13. }
    14. }

    配置web.xml测试

    重定向和转发的区别:

    相同点:页面都会发生跳转

    不同点:

    • 请求转发的时候,url不会改变 307
    • 重定向的时候,url地址栏会发生变化 302

    index.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Hello World!

    3. <%--提交的路径需要寻找到当前项目的路径--%>
    4. "${pageContext.request.contextPath}/login" method="post">
    5. 用户名:"text" name="username">
    6. 密码 :"password" name="password">
    7. "submit">

    success.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. success

    1. public class RequestTest extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. System.out.println("进入这个请求了");
    5. String username = req.getParameter("username");
    6. String password = req.getParameter("password");
    7. System.out.println("username:"+username);
    8. System.out.println("password:"+password);
    9. resp.sendRedirect("/r/success.jsp");
    10. }
    11. @Override
    12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. doGet(req, resp);
    14. }
    15. }
    1. test
    2. com.zr.servlet.RequestTest
    3. test
    4. /login

    HttpServletRequest

    HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,http请求中的所有的信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。

     
    
    1. public class LoginServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. doPost(req, resp);
    5. }
    6. @Override
    7. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    8. req.setCharacterEncoding("utf-8");
    9. resp.setCharacterEncoding("utf-8");
    10. String username = req.getParameter("username");
    11. String password = req.getParameter("password");
    12. String[] hobbys = req.getParameterValues("hobbys");
    13. System.out.println("==================================");
    14. System.out.println(username);
    15. System.out.println(password);
    16. System.out.println(Arrays.toString(hobbys));
    17. //请求转发
    18. //这里的/代表当前的web应用
    19. req.getRequestDispatcher("/success.jsp").forward(req,resp);
    20. }
    21. }

    index.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. 登录
    3. 登录

    4. "text-align: center">
    5. "${pageContext.request.contextPath}/login" method="post">
    6. 用户名:"text" name="username">
    7. 密码:"password" name="password">
    8. 爱好:
    9. "checkbox" name="hobbys" value="唱歌">唱歌
    10. "checkbox" name="hobbys" value="女孩">女孩
    11. "checkbox" name="hobbys" value="写字">写字
    12. "checkbox" name="hobbys" value="代码">代码

    13. "submit">
  • success.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. 登录成功

    web.xml

    1. LoginServlet
    2. com.zr.servlet.LoginServlet
    3. LoginServlet
    4. /login

    Cookie, Session

    cookie

    • 客户端技术(响应,请求)

    session

    • 服务器技术,可以保存用户的会话信息,我们可以把信息或数据放在session中

    常见应用:网站登录一次后,下次可以直接进入。

    Cookie

    从请求中拿到cookie信息

    服务器响应给客户端cookie

    1. //保存用户上一次访问的时间
    2. public class CookieDemo01 extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //解决中文乱码
    6. req.setCharacterEncoding("utf-8");
    7. resp.setCharacterEncoding("utf-8");
    8. resp.setContentType("text/html;charset=utf-8");
    9. PrintWriter out= resp.getWriter();
    10. //cookie,服务器端从客户端获取
    11. Cookie[] cookies = req.getCookies();//返回数组,cookie可能存在多个
    12. //判断cookie是否存在
    13. if (cookies!=null){
    14. //如果存在
    15. out.write("你上一次访问的时间是:");
    16. for (int i = 0; i < cookies.length; i++) {
    17. Cookie cookie = cookies[i];
    18. //获取cookie的名字
    19. if (cookie.getName().equals("lastlogintime")){
    20. //获取cookie中的值
    21. long lastlogintime = Long.parseLong(cookie.getValue());
    22. Date date = new Date(lastlogintime);
    23. out.write(date.toLocaleString());
    24. }
    25. }
    26. }else{
    27. out.write("这是你第一次访问本站!");
    28. }
    29. //服务器给客户端发一个cookie
    30. Cookie cookie = new Cookie("lastlogintime", System.currentTimeMillis()+"");
    31. //有效期为1天
    32. cookie.setMaxAge(24*60*60);
    33. resp.addCookie(cookie);
    34. }
    35. @Override
    36. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    37. doGet(req, resp);
    38. }
    39. }

    web.xml

    1. CookieDemo01
    2. com.zr.servlet.CookieDemo01
    3. CookieDemo01
    4. /c1

    cookie:一般会保存在本地的用户目录下appdata;

    • 一个cookie只能保存一个信息
    • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
    • cookie的大小有限制4kb
    • cookie浏览器上限300个

    删除cookie

    • 不设置有效期,关闭浏览器,自动失效
    • 设置有效期时间为0

    Session

    session:

    • 服务器会给每一个用户(浏览器)创建一个session对象

    • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在

    • 用户登录之后,整个网站都可以访问,-->保存用户的信息

    session和cookie的区别:

    • cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
    • session是把数据写到用户独占的session中,服务器保存(保存重要的信息,减少资源的浪费)
    • session对象由服务器创建

    session保存数据

    1. package com.zr.pojo;
    2. public class Person {
    3. private String name;
    4. private int age;
    5. public Person() {
    6. }
    7. public Person(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. @Override
    24. public String toString() {
    25. return "Person{" +
    26. "name='" + name + '\'' +
    27. ", age=" + age +
    28. '}';
    29. }
    30. }
    1. public class SessionDemo01 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //解决中文乱码
    5. req.setCharacterEncoding("utf-8");
    6. resp.setCharacterEncoding("utf-8");
    7. resp.setContentType("text/html;charset=utf-8");
    8. //得到session
    9. HttpSession session = req.getSession();
    10. //给session存东西
    11. session.setAttribute("name",new Person("周周",1));
    12. //获得session的id
    13. String id = session.getId();
    14. //判断session是不是新创建的
    15. if(session.isNew()){
    16. resp.getWriter().write("session创建成功,ID:"+ id);
    17. }else {
    18. resp.getWriter().write("session已经存在,ID:"+ id);
    19. }
    20. }
    21. @Override
    22. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    23. doGet(req, resp);
    24. }
    25. }
    1. public class SessionDemo02 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //解决中文乱码
    5. req.setCharacterEncoding("utf-8");
    6. resp.setCharacterEncoding("utf-8");
    7. resp.setContentType("text/html;charset=utf-8");
    8. //得到session的数据
    9. HttpSession session = req.getSession();
    10. Person person = (Person) session.getAttribute("name");
    11. System.out.println(person);
    12. }
    13. @Overridejava
    14. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15. doGet(req, resp);
    16. }
    17. }
    1. SessionDemo01
    2. com.zr.servlet.SessionDemo01
    3. SessionDemo01
    4. /s1
    5. SessionDemo02
    6. com.zr.servlet.SessionDemo02
    7. SessionDemo02
    8. /s2

    session手动注销

    1. public class SessionDemo03 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. HttpSession session = req.getSession();
    5. session.removeAttribute("name");
    6. //手动注销session
    7. session.invalidate();
    8. }
    9. @Override
    10. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    11. doGet(req, resp);
    12. }
    13. }

    JSP

    什么是JSP

    jsp:java server pages,Java服务器端界面,和servlet一样,用于开发动态web技术。

    特点

    • 写jsp就像写html
    • 区别
      • html只给用户提供静态的数据
      • jsp页面可以嵌入Java代码,为用户提供动态数据

    JavaBean

    实体类

    JavaBean有特定的写法:

    • 必须要有一个无参构造
    • 属性必须私有化
    • 必须有对应的get/set方法

    一般用来和数据库的字段做映射 ORM;

    ORM对象关系映射

    • 表--->类
    • 字段--->属性
    • 行记录--->对象

    建立数据库相应的字段后创建java实体类

    1. package com.zr.pojo;
    2. //实体类 一般是和数据库中的表结构一一对应的
    3. public class People {
    4. private int id;
    5. private String name;
    6. private int age;
    7. private String address;
    8. public People() {
    9. }
    10. public People(int id, String name, int age, String address) {
    11. this.id = id;
    12. this.name = name;
    13. this.age = age;
    14. this.address = address;
    15. }
    16. public int getId() {
    17. return id;
    18. }
    19. public void setId(int id) {
    20. this.id = id;
    21. }
    22. public String getName() {
    23. return name;
    24. }
    25. public void setName(String name) {
    26. this.name = name;
    27. }
    28. public int getAge() {
    29. return age;
    30. }
    31. public void setAge(int age) {
    32. this.age = age;
    33. }
    34. public String getAddress() {
    35. return address;
    36. }
    37. public void setAddress(String address) {
    38. this.address = address;
    39. }
    40. @Override
    41. public String toString() {
    42. return "People{" +
    43. "id=" + id +
    44. ", name='" + name + '\'' +
    45. ", age=" + age +
    46. ", address='" + address + '\'' +
    47. '}';
    48. }
    49. }
    1. <%@ page import="com.zr.pojo.People" %><%--
    2. Created by IntelliJ IDEA.
    3. User: zr
    4. Date: 2020/10/11
    5. Time: 22:08
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. Title
    10. <%
    11. // People people = new People();
    12. // people.setAddress();
    13. // people.setId();
    14. // people.setAge();
    15. // people.setName();
    16. //和下面的等价
    17. %>
    18. "people" class="com.zr.pojo.People" scope="page"/>
    19. "people" property="address" value="武汉"/>
    20. "people" property="id" value="1"/>
    21. "people" property="age" value="18"/>
    22. "people" property="name" value="小周"/>
    23. 姓名:"people" property="name"/>
    24. id:"people" property="id"/>
    25. 年龄:"people" property="age"/>
    26. 地址:"people" property="address"/>

    MVC三层架构

    MVC:model,view,controller 模型视图控制器

    Model

    • 业务处理,业务逻辑(Service)
    • 数据持久层,CRUD(Dao)

    View

    • 展示数据
    • 提供操作发起Servlet请求(a,form,img ....)

    Controller(Servlet)

    • 接收请求,(req:请求参数,session信息...)
    • 交给业务层处理相应的代码
    • 控制视图的跳转

    工作流程:

    1.浏览器通过视图向控制器发出请求;

    2.控制器接收到请求后对数据进行封装,选择模型进行业务逻辑处理;

    3.随后控制器将模型处理结果转发到视图或下一个控制器;

    4.在视图层合并数据和界面模板生成HTML并做出最终响应。

    过滤器

    Filter:过滤器,用来过滤网站的数据:

    • 处理中文乱码
    • 登录验证...

    Filter
    功能:
    1、⽤来拦截传⼊的请求和传出的响应。
    2、修改或以某种⽅式处理正在客户端和服务端之间交换的数据流。
    如何使⽤?

    与使⽤ Servlet 类似,Filter 是 Java WEB 提供的⼀个接⼝,开发者只需要⾃定义⼀个类并且实现该接⼝
    即可。

    Filter 的⽣命周期
    当 Tomcat 启动时,通过反射机制调⽤ Filter 的⽆参构造函数创建实例化对象,同时调⽤ init ⽅法实现
    初始化,doFilter ⽅法调⽤多次,当 Tomcat 服务关闭的时候,调⽤ destory 来销毁 Filter 对象。
    ⽆参构造函数:只调⽤⼀次,当 Tomcat 启动时调⽤(Filter ⼀定要进⾏配置)
    init ⽅法:只调⽤⼀次,当 Filter 的实例化对象创建完成之后调⽤
    doFilter:调⽤多次,访问 Filter 的业务逻辑都写在 Filter 中
    destory:只调⽤⼀次,Tomcat 关闭时调⽤。
    同时配置多个 Filter,Filter 的调⽤顺序是由 web.xml 中的配置顺序来决定的,写在上⾯的配置先调
    ⽤,因为 web.xml 是从上到下顺序读取的。

    实际开发中 Filter 的使⽤场景:
    1、统⼀处理中⽂乱码。
    2、屏蔽敏感词。

    监听器

    监听器GUI编程中经常使用

    JDBC

    Java连接数据库,导入JDBC依赖mysql-connector-java,IDEA中连接数据库

    1. public class TestJdbc {
    2. public static void main(String[] args) throws ClassNotFoundException, SQLException {
    3. //配置信息
    4. String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8";
    5. String username = "root";
    6. String password = "123456";
    7. //加载驱动
    8. Class.forName("com.mysql.jdbc.Driver");
    9. //连接数据库
    10. Connection connection = DriverManager.getConnection(url, username, password);
    11. //向数据库发送sql的对象
    12. Statement statement = connection.createStatement();
    13. //编写sql
    14. String sql = "select * from users";
    15. //执行查询sql,返回一个结果集
    16. ResultSet rs = statement.executeQuery(sql);
    17. while (rs.next()){
    18. System.out.println("id="+rs.getObject("id"));
    19. System.out.println("name="+rs.getObject("name"));
    20. System.out.println("password="+rs.getObject("password"));
    21. System.out.println("email="+rs.getObject("email"));
    22. System.out.println("birthday="+rs.getObject("birthday"));
    23. }
    24. //关闭连接
    25. rs.close();
    26. statement.close();
    27. connection.commit();
    28. }
    29. }

    预编译sql

    Junit单元测试

    依赖

    1. junit
    2. junit
    3. 4.12
    4. test

    简单使用

    @Test注解只在方法上有效,只要加了这个注解的方法,就可以直接运行.

    1. public class TestJdbc3 {
    2. @Test
    3. public void test(){
    4. System.out.println("Hello");
    5. }
    6. }

    转账事务(创建account表,字段id,name,money),使用单元测试

    1. public class TestJdbc3 {
    2. @Test
    3. public void test() {
    4. //配置信息
    5. String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8";
    6. String username = "root";
    7. String password = "123456";
    8. Connection connection=null;
    9. //加载驱动
    10. try {
    11. Class.forName("com.mysql.jdbc.Driver");
    12. //连接数据库
    13. connection = DriverManager.getConnection(url, username, password);
    14. //通知数据库开启事务
    15. connection.setAutoCommit(false);
    16. String sql1 = "update account set money=money-100 where name='A'";
    17. connection.prepareStatement(sql1).executeUpdate();
    18. //制造错误
    19. int i=1/0;
    20. String sql2 = "update account set money=money+100 where name='B'";
    21. connection.prepareStatement(sql2).executeUpdate();
    22. connection.commit();//以上sql都执行成功才提交
    23. System.out.println("提交成功!");
    24. } catch (Exception e) {
    25. try {
    26. //如果出现异常,就回滚事务
    27. connection.rollback();
    28. System.out.println("转账失败!");
    29. } catch (SQLException throwables) {
    30. throwables.printStackTrace();
    31. }
    32. e.printStackTrace();
    33. }finally {
    34. try {
    35. connection.close();
    36. } catch (SQLException throwables) {
    37. throwables.printStackTrace();
    38. }
    39. }
    40. }
    41. }

  • 相关阅读:
    复杂的指针面试题
    opencascade 布尔运算笔记
    使用项目的prettier格式化项目代码
    【Rust日报】2022-11-28 使用 Rust 编写解释型语言
    Fiddler之Replay功能详解
    c++ vs2019 cpp20规范的STL库的map与multimap源码分析
    __int128类型movaps指令crash
    金仓数据库 KingbaseES 插件参考手册 plsql_plprofiler
    力扣(LeetCode)1704. 判断字符串的两半是否相似(C++)
    多普勒流速仪的功能作用是什么?
  • 原文地址:https://blog.csdn.net/qq_57747969/article/details/132667626