javaweb

Tomcat

配置端口号:

Tomcat文件夹=》conf=》sever.jsp文件下=》
在这里插入图片描述
在这里插入图片描述

配置主机的名称

路径:C:\Windows\System32\drivers\etc hosts文件
在这里插入图片描述
在这里插入图片描述

默认端口号

Tomcat: 8080
mysql:3306
http:80
https:443

高难度面试题

网站是如何进行访问的!

1.输入域名 回车
2.检查本机的C:\Windows\System32\drivers\etc hosts配置文件下有没有这个域名映射;
有则:直接返回对应的ip地址,这个地址中有我们需要访问的web程序,可以直接访问
没有:去DNS服务器找(全世界的网站域名都在这里)

发布一个网站

将自己的网站,放到服务器中在指定的web应用的文件夹下面(webapps)

Http

什么是Http

Http(超文本传输协议)是一个简单的请求-响应协议,他通常在TCP之上

  • 文本:html、字符串、。。。
  • 超文本:图片、音乐、视频、定位、地图。。。
  • 80
    Https:安全的 443

两个时代

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

Http请求

客户端——发请求——到服务器
百度:

Request URL:https://www.baidu.com/  //请求地址
Request Method:GET					//方法get、post
Status Code:200 OK					//状态码
Remote Address:14.215.177.39:443	//远程

1.请求行
请求方式为get
get:能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容。不安全但高效
post:能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容。安全但不高效
2.消息头

Accept:告诉浏览器,他所支持的数据类型
Accept-Encoding: 支持哪种编码格式
Accept-Language:告诉浏览器 他的语言环境
cache-Control:缓存控制
Connection:告诉主机,请求完成是保持终断还是连接
Host:主机

Http响应

服务器——响应——客户端

1.响应体

Accept:告诉浏览器,他所支持的数据类型
Accept-Encoding: 支持哪种编码格式
Accept-Language:告诉浏览器 他的语言环境
cache-Control:缓存控制
Connection:告诉主机,请求完成是保持终断还是连接
Host:主机
Refrush: 告诉客户端,多久刷新一次
Location:让网页重新定位;

2.响应状态码
200:成功
3**:请求重定向
重定向:你给我到我给你的新位置去
404:找不到资源
资源不存在
5**:服务器代码错误 500 502(网关错误)

常见面试题:
当你的浏览器地址栏输入地址并回车的一瞬间到页面能返回回来,经历了什么?

Maven

为什么学习这个技术

1.在javaweb开发中,需要大量的jar包,我们手动导入
2.如何让一个东西帮我们导入和配置这个jar包
	由此Maven产生

Maven项目架构管理工具

我们目前用来就是方便导入jar包
Maven的核心思想:约定大于配置

下载安装Maven

官网:https://maven.apache.org
在这里插入图片描述
下载完成后解压

配置环境变量

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME ,maven目录
  • 在系统的path中配置 %MAVEN_HOME%\bin
  • 测试配置成功与否

在这里插入图片描述

(阿里云镜像)修改配置文件

在conf目录下的setting文件

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url> 
</mirror>

本地仓库

建立一个本地仓库:localRepository

<localRepository>D:\java\Maven\apache-maven-3.8.1\maven-repo</localRepository>

在idea中使用Maven

启动idea=》创建mavenWeb项目=》=》创建项目名=》配置setting和localRepository=》等待项目初始化完成
在这里插入图片描述
观察maven-repo仓库中出现了什么东西
在这里插入图片描述idea中的maven设置

在这里插入图片描述

创建一个普通的maven项目

在这里插入图片描述

在这里插入图片描述

在idea中配置Tomcat

在这里插入图片描述

pom文件

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

Servlet

什么是servlet

  • servlet就是sun公司开发动态web的一门技术
  • sun公司在这些API中提供了一个接口叫做:servlet,如果你想开发一个servlet程序只需要实现两个小步骤
    1.用类实现servlet接口
    2.把开发好的java类部署到web服务中
    把实现了servlet接口的java程序叫做,servlet

HelloServlet

1.构建一个普通的Maven项目,删掉里面的src目录,我们的学习就在这个项目里建立module
2.关于maven项目父子工程的理解:
父项目中会有

    <modules>
        <module>servlet-01</module>
    </modules>
父项目中的java子项目可以直接使用

maven环境优化

1.修改web.xml为最新的(用Tomcat的)
2.将maven的结构搭建完整

编写一个Servlet程序

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

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

编写Servlet的映射

为什么需要映射:我们写的java程序,需要在通过浏览器访问,而浏览器连接web服务器,所以我们要在web服务中注册我们写的servlet,还需要给它一个浏览器能访问的路径。
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.hua.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

配置Tomcat
运行测试

servlet原理

servlet是由web服务器调用,web服务器在收到浏览器请求后,会
在这里插入图片描述

mapping 问题

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

<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
</servlet-mapping>

2.一个servlet指定映射多个映射

<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
</servlet-mapping>

3.默认请求路径

<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

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

servletContex对象

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

  • 共享数据(我在这个servlet程序中,可以传到其他srevlet程序中)
public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String username= (String)servletContext.getAttribute("username");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print(username);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String username= (String)servletContext.getAttribute("username");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print(username);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.hua.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>getServlet</servlet-name>
        <servlet-class>com.hua.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getServlet</servlet-name>
        <url-pattern>/getServlet</url-pattern>
    </servlet-mapping>

访问结果:
在这里插入图片描述

  • 获取初始化参数
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/</param-value>
    </context-param>
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        PrintWriter writer = resp.getWriter();
        writer.print(url);
    }
  • 请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext servletContext = this.getServletContext();
    //RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/servletDemo03");//转发请求路径
    //requestDispatcher.forward(req,resp);//调用forward实现转发
    servletContext.getRequestDispatcher("/servletDemo03").forward(req,resp);
}
<servlet>
    <servlet-name>servletDemo04</servlet-name>
    <servlet-class>com.hua.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servletDemo04</servlet-name>
    <url-pattern>/servletDemo04</url-pattern>
</servlet-mapping>

  • 读取资源文件
    Properties
  • 在java目录下新建的properties
  • 在resources目录下新建的properties
    发现:都被打包到了同一路径下:classes我们统称为classpath
    注意:java目录下需要配置pom文件,否则不能打包
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties properties = new Properties();
        properties.load(resourceAsStream);
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        resp.getWriter().print("username="+username+";\npassword="+password);
    }

HttpServletResponse下载文件

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

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

简单分类

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

    ServletOutputStream getOutputStream() throws IOException;
    PrintWriter getWriter() throws IOException;

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

    void setCharacterEncoding(String var1);
    void setContentLength(int var1);
    void setContentLengthLong(long var1);
    void setContentType(String var1);
    void setDateHeader(String var1, long var2);
    void addDateHeader(String var1, long var2);
    void setHeader(String var1, String var2);
    void addHeader(String var1, String var2);
    void setIntHeader(String var1, int var2);
    void addIntHeader(String var1, int var2);

响应的状态码常量

HttpServletResponse接口下

常见应用

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

  • 获取下载文件路径、下载文件名是啥、让浏览器支持我们下载的东西、
  • 获取下载文件的输入流、创建缓冲区、获取OutputSteam对象、将FileOutputSteam写到缓冲区
  • 使用OutputSteam将缓冲区中的数据输出到客户端
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //- 获取下载文件路径、
        String realPath = "D:\\IdeaProjects\\javaweb-servlet02-maven\\response\\src\\main\\resources\\飞船.jpg";
        System.out.println("下载文件的路径"+realPath);
        //下载文件名是啥、
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        //让浏览器支持我们下载的东西、   
        resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
        //- 获取下载文件的输入流、
        FileInputStream fileInputStream = new FileInputStream(realPath);
        //创建缓冲区、
        int let =0;
        byte[] buffer = new byte[1024];

        //获取OutputSteam对象、
        ServletOutputStream outputStream = resp.getOutputStream();

        //将FileOutputSteam写到缓冲区,使用OutputSteam将缓冲区中的数据输出到客户端
        while((let=fileInputStream.read(buffer))>0){
            outputStream.write(buffer,0,let);
        }
        fileInputStream.close();
        outputStream.close();
    }

验证码功能

验证码怎么来?:

  • 前端实现
  • 后端实现,需要用到java图片类,生成一个图片
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器3秒刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();//笔
        //设置图片的背景颜色
        graphics.setColor(Color.white);
        graphics.fillRect(0,0,80,20);
        //给图片写数据
        graphics.setColor(Color.BLUE);
        graphics.setFont(new Font(null,Font.BOLD,15));
        graphics.drawString(getRandom(),0,20);
        //告诉浏览器这个请求用浏览器打开
        resp.setContentType("image/jpg");
        //网站存在缓存  不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","noache");
        //把图片写给浏览器
        ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
    }
    //生成随机数
    private String getRandom(){
        Random random = new Random();
        String num = random.nextInt(99999999)+"";
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            stringBuffer.append('0');
        }
        return num.toString()+stringBuffer;
    }

实现重定向(重要)

一个web资源收到客户端请求后,他会通知客户端去访问另一个web资源,这个过程叫重定向
常用场景:用户登录

void sendRedirect(String var1) throws IOException;

面试题

重定向和转发的区别:
相同点:
都会实现页面跳转
不同点:
重定向会实现url的转变
转发不会

HttpServletRequest

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

获取前端传递的参数,请求转发

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<h1>登录</h1>
<div style="text-align: center;">
    <%--以post方式提交表单,提交到我们login请求--%>
    <form action="${pageContext.request.contextPath}/loginServlet" method="post">
        用户名:<input type="text" name="username"><br>
        密码:  <input type="password" name="password"><br>
        爱好:
        <input type="checkbox" name="hobbys" value="女孩">女孩
        <input type="checkbox" name="hobbys" value="代码">代码
        <input type="checkbox" name="hobbys" value="唱歌">唱歌
        <input type="checkbox" name="hobbys" value="电影">电影
        <br>
        <input type="submit" name="submit">
    </form>
</div>
</body>
</html>

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.println("=======================================");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("=======================================");

        //请求转发
        //resp.sendRedirect("/request_war/success.jsp");
        req.getRequestDispatcher("/success.jsp").forward(req,resp);

    }
}

请求转发和重定向的区别

重定向和转发的区别:
相同点:
都会实现页面跳转
不同点:
重定向会实现url的转变 编码307
转发不会 编码302

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值