JavaWeb学习笔记

JavaWeb

1.ASP、PHP、JSP

ASP:

  • 微软:最早流行的就行ASP

  • 在HTML嵌入VB的脚本

  • 在ASP中,基本一个界面就有几千行代码,页面极其混乱,维护成本高

  • c#编程语言

  • IIS服务器

    <h1>
    <%
    system.out.println("hello")
    %>
    <h1>
    

PHP

  • 开发速度很快,功能很强大,跨平台,代码简单

  • 无法承载大访问量的情况;(局限性)

JSP/Servlet

  • B/S:浏览和服务器

  • C/S:客户端和服务器

​ sun公司主推的B/S架构

​ 基于Java语言(所有的大公司,一些开源的组件,都是Java写的)

​ 可以承载三高带来的问题

​ 语法像ASP,ASP->JSP,加强市场强度

2.请求方式:Get、Post、HEAD,DELETE,PUT,TRACT(微服务的时候会用到)
  • get:请求携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效。

  • post:请求携带的参数无限制,大小无限制,会在浏览器的URL地址栏显示数据内容,安全,但不高效。

3.响应状态码:

200:请求响应成功

3xx:请求重定向

  • ​ 重定向:重新到我给你指定的新位置去

4xx:找不到资源 404

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

4.HTTP和HTTPS
Http:超文本传输协议,是一个简单的请求响应协议,通常运行在TCP上
  • 文本:html,字符串

  • 超文本:图片,音乐,视频,定位

  • 端口号:80

  • 两个时代

    • http1.0:http/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接
    • http2.0:http/1.1:客户端可以与多个web服务器连接后,可以获得多个web资源
Https:安全的
  • 端口号:443
常见面试题:

当你的浏览器中地址栏输入地址并回车的一瞬间页面能够展示回来,经历的什么?

5.Maven

为什么学习这个技术?

​ 1.在javaweb开发中,需要导入大量的jar包,我们手动去导入

​ 2.如何让一个东西自动帮我导入和配置这个jar包,由此Maven诞生了

6.Servlet
  • 简介:Servlet就是sun公司开发动态web的一门技术
  • Sun在这些API中提供一个接口叫做:Servlet,有两个默认的实现类,HttpServlet
    1. 编写一个类,实现Servlet接口
    2. 把开发好的Java类部署到web服务器中
    3. 把实现了Servlet接口的Java程序叫做Servlet

HelloServlet

  1. 编写一个普通类
  2. 实现Servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet {
    //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ServletOutputStream outputStream = resp.getOutputStream();
        PrintWriter writer = resp.getWriter();//响应流
        writer.print("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

3.编写Servlet的映射

​ 为什么需要映射:我们写的Java程序需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在Web服务中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径

<!--  注册Servlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.wyf.servlet.HelloServlet</servlet-class>
  </servlet>
<!--  Servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>helloServlet</url-pattern>
  </servlet-mapping>

4.配置Tomcat

关于request和response的理解

1.request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。

2.当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。

3.其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。

4.每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象)

5.在请求处理完,响应结束时,服务器会销毁request和response对象。

Servlet原理

servlet是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器和 HTTP 服务器上的数据库的中间层。

在这里插入图片描述

优先级问题:指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
7.ServletContext

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

  • 共享数据:我在这个Servlet中保存的数据,可以在另外一个servlet中拿到。

    ServletContext是在上层,在不同的servlet中是通用的

ServletContext的属性通用,即setAttribute()和getAttribute(),会用session或者request一些方法代替ServletContext的属性通用

//web.xml
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.wyf.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>hello</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>getContext</servlet-name>
    <servlet-class>com.wyf.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getContext</servlet-name>
    <url-pattern>getc</url-pattern>
  </servlet-mapping>
  
  //需要先通过url请求hello给ServletContext属性赋值(key,value形式)
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String name = "王";
        context.setAttribute("username",name);//将一个数据保存在ServletContext中,名字为:username,值name
    }
}
 //之后再通过url请求取出ServletContext中的值
public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");

        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        resp.getWriter().print("名字" + username );
    }
}

ServletContext的请求转发

//获得转发路径,调用forward实现请求转发,url路径不会发生改变,但是重定向会发生改变
context.getRequestDispatcher("hello").forward(req,resp);

ServletContext的读取资源文件

Properties

  • 在Java目录下新建properties,(可能会出现在target中classes目录下没有打包后的.properties文件,需要修改配置文件,修改过滤条件)
  • 在resources目录下新建properties

发现:都被打包到了同一个路径下,classes,我们俗称这个路径为classpath

思路:需要一个文件流

db.properties文件内容
username=root
password=root
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream inputStream = this.getServletContext().getResourceAsStream("WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(inputStream);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user + pwd);
    }
}
8.Response文件下载
public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取文件下载的路径,1.png为项目工程resources目录下的一张图片
        String realPath = this.getServletContext().getRealPath("/1.png");
       
       //2.获取下载的文件名截取最后一个/,得到/后面的字符串就是文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
        
        //3.想办法设置让浏览器能够支持(Content-Disposition)下载我们需要的东西
        resp.setHeader("Content-Disposition","attachment;filename"+ URLEncoder.encode(fileName,"UTF-8"));
       
       //4.获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        
        //5.创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
       
       //6.获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
       
       //7.将FileOutputStream流写到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
        while((len = in.read(buffer)) != -1){
        out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }

文件下载效果图如下:

9.Response验证码功能(不重要)

验证怎么来的?

  • 前端实现

  • 后端实现

    public class ImageServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //如何让浏览器3秒自动刷新一次
            resp.setHeader("refresh","3");
    
            //在内存中创建图片
            BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
            //得到图片
            Graphics2D graphics = (Graphics2D) image.getGraphics();//笔
            //设置图片的背景颜色
            graphics.setColor(Color.white);
            graphics.fillRect(0,0,80,20);
            //给图片写数据
            graphics.setColor(Color.BLUE);
            graphics.setFont(new Font(null,Font.BOLD,20));
            graphics.drawString(makeNum(),0,20);
    
            //告诉浏览器,这个请求用图片的方式打开
            resp.setContentType("image/jpg");
            //网站存在缓存,不让浏览器缓存
            resp.setDateHeader("expires",-1);
            resp.setHeader("Cache-Control","no-cache");
            resp.setHeader("Pragma","no-cache");
    
            //把图片写给浏览器
            boolean write = ImageIO.write(image,"jpg",resp.getOutputStream());
        }
        //生成随机数
        private String makeNum(){
            Random random = new Random();
            String num = random.nextInt(9999999 ) + "";
            StringBuffer sb = new StringBuffer();
            //for循环是为了保证随机数的位数为7位,for循环是重点
            for (int i = 0; i < 7-num.length();i++){
                sb.append("0");
            }
            num = sb.toString() + num;
            return  num;
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    效果图如下:

10.实现重定向

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        resp.setHeader("Location","/img");
        resp.setStatus(302);
         */
        resp.sendRedirect("/img");//重定向
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

面试题:请你聊聊重定向和转发的区别?

相同点

  • 页面都会实现跳转

不同点

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

重定向常见场景:

  • 用户登录

    get方式

void sendRedirect(String var1) throws IOException;

post方式

11.Cookie、Session(保存会话的两种技术)

会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话。

一个网站,怎么证明你来过?

客户端 服务端

1.服务端给客户端一个信件,客户端下次访问带上信件就可以了:cookie

2.服务端登记你来过了,下次你来的时候我匹配你:session

  • Cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
    • 从请求中拿到cookie信息
    • 服务器响应给客户端cookie

cookie的细节

  • 一个cookie只能保存一个信息,每个cookie大小上限为4kb

  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie

  • 300个cookie浏览器上限

  • 删除cookie:不设置有效期,关闭浏览器,自动失效,或者设置有效时间为0

  • 虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

12.Session(重点)

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关,这个Session就存在
  • 用户登录之后,整个网站它都可以访问。保存用户的信息,保存购物车的信息

一个浏览器对应一个SessionId,不同浏览器的SessionId不同,相同浏览器的SessionId相同

Session的使用


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


使用场景:

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存在Session中


在这里插入图片描述
ServletContext可以存取不同用户中的数据,Session只能存取当前用户数据,ServletContext后期改名为ApplicationContext

14.JSP

Java Server Pages:Java服务器端界面,也和servlet一样,用于动态Web技术

最大的特点:

  • 写JSP就像是在写HTML
  • 区别
    1. HTML只提供给用户静态数据
    2. JSP中可以嵌入JAVA代码,为用户提供动态数据

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet

JSP最终也会转变为一个Java类,JSP本质就是一个Servlet

15.JavaBean特定写法
  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的getter/setter方法

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

ORM:对象映射关系

  • 表—>类
  • 字段—>属性
  • 行记录—>对象
16.MVC三层架构

微服务之前都是这个架构,MVC三层架构

Model层

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

View层

  • 展示数据
  • 提供链接发送Servlet请求(a、form、img…)

Controller层(Servlet)

  • 接收用户的请求(req:请求参数、Session信息…)

  • 交给业务层处理对应的代码

  • 控制视图的跳转

17.Filter(重点)

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

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

2.编写过滤器

  • 导包不要错

  • 实现Filter接口

public class CharacterEncodingFilter implements Filter {
    //初始化:Web服务器启动,就已经初始化了,随时等待过滤对象出现
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    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");

        /*
        filterChain:过滤器链
        1.过滤中的所有代码,在过滤特定请求的时候都会执行
        2.必须要让过滤器继续同行
         */
        System.out.println("CharacterEncodingFilter执行前");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止
        System.out.println("CharacterEncodingFilter执行后");

    }
    //销毁:Web服务器关闭的时候,过滤会销毁
    @Override
    public void destroy() {

    }
}

  • 在web.xml中配置Filter
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.wyf.Filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <!--只要是/servlet/...的任何请求,都会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>
18.用Filter进行简单的未登录拦截

实现一个过滤器,判断用户Session的属性是否存在(登录成功后给Session赋值),不存在重定向错误界面

19.JDBC

什么是jdbc?Java连接数据库

jdbc的ACID四个特性,原子性,一致性,隔离性,持久性

Java代码中一定要通知数据库开启事务

20.超市订单管理系统-实战(部分代码)

1.数据库配置文件db.properties

2.连接数据库

在这里插入图片描述

在这里插入图片描述

3.写一个乱码公共过滤器

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值