【JavaWeb】Servlet,Request,Responce

2023-10-31

【JavaWeb】核心技术

Tomcat

1.安装配置目录使用部署创建

image-20220704123439263

配置:修改启动端口号:conf/server.xml

port="8080" protocol="HTTP/1.1"可以将8080改为80默认端口

项目部署:将项目放到webapps目录下,即部署完成。

一般javaweb项目会被打包成war包,然后将war包放到webapps目录下,Tomcat会自动解压缩war文件

image-20220704172709333

image-20220704173026043

2.idea集成Tomcat

1.直接添加本地Tomcat

image-20220704211735335

添加服务配置项,选择Tomcat路径,然后再添加一个项目模板就可以了。

2.使用maven配置项添加Tomcat

<plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>common-tomcat-maven-plugin</artifactId>
        <version>2.2</version>
      </plugin></plugins>

Servlet

java提供的一门动态web资源开发技术

例子:

localhost:8080/web/login?username=1
localhost:8080/web/login?username=2
localhost:8080/web/login?username=3
这三个页面所返回的内容不同,这就是动态web资源

Servlet是JavaEE的规范之一,是一个接口,将来需要定义Servlet类来实现Servlet接口,并由web服务器运行Servlet。

Servlet快速入门

1.创建web项目,导入Servlet依赖坐标

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

2.创建:定义一个类,实现Servlet接口,重写接口中的所有方法,并在service方法中输入一句话

public void service() {
        System.out.println("Servlet hello world~");
    }

3.配置:在类上使用@webServlet注解,配置访问路径 /demo1

@WebServlet("/demo1")
public class aaa implements Servlet {

4.访问:启动Tomcat,访问Servlet

package com.lyp.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo1")
public class aaa implements Servlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet hello world~");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

}

Servlet生命周期

1.加载和实例化,Servlet第一次被访问的时候,由容器创建Servlet对象

2.初始化:init()方法,只调用一次。

3.请求处理:每次请求Servlet时,都会调用service()方法请求处理

4.服务终止:destroy()方法释放资源,释放Servlet实例。

	@Override
    public void init(ServletConfig servletConfig) throws ServletException {

    } 	
 	
 	@Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) 	throws ServletException, IOException {
        System.out.println("Servlet hello world~");
    }
 	
 	@Override
    public void destroy() {

    }
	//获取Servelet信息,基本不用
	@Override
    public String getServletInfo() {
        return null;
    }
    //获取ServletConfig对象,Servlet配置信息
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

两个方法共同使用一个变量:

public class aaa implements Servlet {
    private ServletConfig config;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.config=config;
        System.out.println("init...");
    }

    @Override
    public ServletConfig getServletConfig() {
        return config;
    }

Servlet体系结构

image-20220704221657247

@WebServlet("/demo4")
public class Servlet_demo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("GET...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("POST...");
    }
}

为什么要根据请求方式的不同,调用不同的方法?

get和post请求参数的位置不同,service方法要先获取请求方式,再分别写处理逻辑,这些逻辑代码或很繁琐

可以直接extends HttpServlet类来实现这些不同方式的逻辑代码。

如何调用?

获取请求方式来进行逻辑判断。根据不同请求方式,调用不同的doxxx方法

Servlet urlPattern配置

配置访问路径(urlPattern)

1.一个Servlet可以配置多个urlPattern

@WebServlet(urlPatterns = {"/demo1" , "/demo2"})

2.urlPattern配置规则

  1. 精确匹配
  2. 目录匹配
  3. 扩展名匹配
  4. 任意匹配

image-20220704223610111

image-20220704223714587

XML配置Servlet

可以直接在web.xml里配置Servlet的路径

<!--
  Servlet 全类名
  -->
  <servlet>
    <servlet-name>demo4</servlet-name>
    <servlet-class>com.lyp</servlet-class>
  </servlet>
  <!--
  Servlet 访问路径
  -->
  <servlet-mapping>
    <servlet-name>demo4</servlet-name>
    <url-pattern>/demo4</url-pattern>
  </servlet-mapping>

Request,Responce

把请求数据和返回数据放在一个对象里。

例子:

@WebServlet("/name1")
public class requ_resp extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用res对象,获取请求数据,这是一个get方式的数据
        String name = req.getParameter("name");//localhost:8080/name1?name=aaa

        //使用resp对象,设置响应数据
        resp.setHeader("content-type","text/html;charset=utf-8");
        resp.getWriter().write("<h1>"+name+"欢迎您!</h1>");
    }
}

image-20220704230533593

image-20220704230627265

request继承体系

image-20220704232449607

接口不能直接用,要继承,我们用的都是类和类实例化之后的对象

实现类要Tomcat来定义,因为实现类是Tomcat解析的,不是java语言本身

Tmocat解析请求数据,封装成request对象创建request对象传递到service方法里面去。

request获取请求数据

1.获取请求行数据

例如这样的请求行:

GET /day14/demo1?name=zhangsan HTTP/1.1

方法:

  1. 获取请求方式:GET

    String getMethod()
    
  2. 获取虚拟目录: /day14

    String getContextPath()
    
  3. 获取Servlet路径:/demo1

    String getServletPath()
    
  4. 获取get方式请求参数:name=zhangsan

    String getQueryString()
    
  5. 获取请求URI:/day14/demo1

    String getRequestURI() :   /day14/demo1     URI:统一资源标识符
    StringBuffer getRequestURL() :   http://localhost/day14/demo1    URL:统一资源定位符
    
  6. 获取协议及版本:HTTP/1.1

    String getProtocol()
    
  7. 获取客户机ip地址

    String getRemoteAddr()
    

    2.获取请求头数据

    例:

    user-agent: Mozilla/5.0 Chrome/105.0.0.0 
    

    方法:

    String getHeader(String name):通过请求头名称获取请求头的值
    String header = req.getHeader("user-agent");
        
    Enumeration<String> getHeaderName():获取所有的请求头名称
    

    3.获取请求体数据

    请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

    username=admin&password=123456
    

    步骤:

    1.获取流对象

    BufferedReader getReader() :获取字节输入流
        
    BufferedReader br = req.getReader();
    

    2.再从流对象中读取数据

    String line = br.readline();
    System.out.println(line);
    

    4.统一方式获取请求参数

    doget和dopost里面都可以用的方法

    可以把代码直接copy过去(要传递一下req和resp this.doget(req,resp)

    1. String getParameter(String name): 根据参数名称获取参数值
    2. String[] getParameterValues(String name): 根据参数名称获取参数值的数组
    3. Enumeration<String> getParameterValueNames(): 获取所有的参数名称
    4. Map<String, String[]> getParameterMap(): 获取所有参数的键值对集合
    

request请求转发

一种在服务器内部的资源跳转方式。

image-20220705141036051

步骤:

  1. 通过request对象来获取请求转发器对象:

    RequestDispatcher getRequestDispatcher(String path)
    
  2. 使用RequestDispatcher对象进行转发:

    forward(ServletRequest request, ServletResponse response)
    

一行代码:

req.getRequestDispatcher("/demo6").forward(request,response);

特点:

  1. 浏览器地址栏路径不发生变化
  2. 只能转发到当前的服务器内部资源中
  3. 转发是一次请求

资源之间怎么共享数据:request对象

1. void setAttribute(String name, Object obj): 存储数据
2. Object getAttribute(String name): 通过键获取值
3. void removeAttribute(): 通过键移除键值对

responce设置响应数据

设置响应行:

  1. 格式:HTTP/1.1 200 ok

  2. 设置状态码:

    void setStatus(int sc)
    

设置响应头:

void setHeader(String name, String value)

设置响应体:

使用步骤:

  1. 获取输出流

    字符输出流:PrintWriter getWriter()

    字节输出流:ServletOutputStream getOutputStream()

  2. 使用输出流,将数据输出到客户端浏览器中

responce重定向

image-20220705142311253

responce响应字符、字节数据

@WebServlet("/resp1")
public class resp extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //1.获取字符输出流:(默认编码iso,中文会乱码)
        PrintWriter write = resp.getWriter();

        //content-type
        //resp.setHeader("content-type","text/html");
        write.write("aaa");
        write.write("<h1>hello</h1>");

        //细节:字符流不需要关闭
    }
@WebServlet("/resp2")
public class resp2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.读取文件
        FileInputStream fis = new FileInputStream("d://a.jpg");

        //2.获取response字节输出流
        ServletOutputStream os = resp.getOutputStream();//重要代码

        //3.完成流的copy
        
//        byte[] buff = new byte[1024];
//        int len = 0;
//        while ((len = fis.read(buff))!=-1){
//            os.write(buff,0,len);
//        }
        
        //或者采用工具类的copy方法:
        IOUtils.copy(fis,os);
        
        fis.close();
    }

JSP

Java Server Pages:java服务端页面

一种动态的网页技术,既可以定义Html,js,css等静态内容,还可以定义Java代码的动态内容

JSP=HTML+Java

JSP本质上就是一个Servlet

image-20220705173251452

JSP的脚本:

JSP定义Java代码的方式

<% 代码 %>:定义的Java代码,在service方法中。service可以定义什么,该脚本中就可以定义什么。
<%! 代码 %>:定义的Java代码,在jsp转换后的java类的成员位置。
<%= 代码 %>:定义的Java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

MVC三层架构:

image-20220705173840145

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JavaWeb】Servlet,Request,Responce 的相关文章

随机推荐

  • Nginx添加SSL模块

    目录 一 SSL 概述 SSL证书 HTTPS SSL工作原理 二 创建SSL证书 安装openssl 生成证书 三 nginx配置 nginx打补丁添加模块 nginx conf配置 四 访问 一 SSL 概述 SSL Security
  • 向日葵权限mac

    问题 权限打开后自动关上 解决 mac上几乎所有远程软件都会出现这种权限设置问题 换了腾讯会议或其他也没用 方法一 试试先打开系统的安全性设置 将向日葵软件从隐私框里移出来 点击 号移除 再重新添加进去 方法二 将权限的勾选去掉 再添加 然
  • EFCore 数据模型 和 值转换

    操作中经常要涉及到模型和值转换的问题 这里记录一下 实际使用过程中遇到过的问题 而非功能的全部 模型 EFCore中支持字段 参考地址 https docs microsoft com zh cn ef core modeling back
  • SpringBoot框架详解,实战入门教程

    SpringBoot作为当下Java开发最常用的技术框架 相信你也一定听过很多次了 那么到底什么是SpringBoot SpringBoot又有什么用呢 跟着动力节点的视频快速入门springboot 视频观看资源 https www bi
  • CIKM 2023|TASTE:通过文本匹配缓解序列化推荐中流行偏差问题

    序列化推荐系统旨在根据用户的浏览历史动态地为用户推荐下一个商品 这在Yelp TikTok Amazon等众多Web应用程序中发挥着至关重要的作用 这些推荐系统通过使用不同的神经网络架构来学习用户 商品交互中商品之间的依赖关系 从而对用户行
  • Qt:文管打开方式:选择并设置默认程序

    默认启动APP配置文件 local share applications mimeapps list config mimeapps list etc gnome defaults list 全局 QAction action choose
  • 整理一些spring常见的扩展点

    一 各种后处理器 1 1 BeanDefinition与BeanFactory扩展 1 1 1 BeanDefinitionRegistryPostProcessor接口 Extension to the standard link Bea
  • 解决Vue前端报错——Error: Cannot find module ‘node-sass‘

    解决Vue前端报错 Error Cannot find module node sass 今天在使用VsCode 导入一个新Vue項目文件夹的时候出现了以下的问题 npm run dev提示 Cannot find module node
  • Winform自定义表单(转)

    出处 http www newlifex com showtopic 167 aspx 好吧 附件真的损坏了 原始代码我也没有了 再提取我也没精力了 不好意思 哪位之前下过可以重发一遍吗 不过即使没有也可以参考下面几个示例很快就可以做出来了
  • docker容器二之Dockerfile详解+镜像的优化

    文章目录 Dockerfile详解 Dockerfile常用指令 Dockerfile示例 实验截图 解决报错 Shell和exec格式的区别 镜像的优化 Dockerfile详解 Dockerfile常用指令 首先先明白 什么是Docke
  • matlab/simulink scope 示波器添加菜单栏的方法

    在用matlab simulink scope 示波器的时候 弹出的图像框没有菜单栏 保存复制等操作极为不便 以下操作可以让示波器的图形窗口显示出菜单栏 在matlab的command window里执行下面两句代码 set 0 ShowH
  • 【华为OD机试】工号不够用了怎么办【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 3020年 空间通信集团的员工人数突破20亿人 即将遇到现有工号不够用的窘境 现在 请你负责调研新工号系统 继承历史传统 新的工号系统由小写英文字母 a z 和数字
  • spring的ApplicationContext 得到方式

    ClassPathXmlApplicationContext会自己在CLASSes里面找 不过我只是把配置文件放在src文件下成功找到过 String paths applicationContextDataSource xml appli
  • MarkDown中写流程图的方法

    序 Mermaid FlowChat 中译为美人鱼 就好比一条美人鱼在流动构成了流程图 是一种在MarkDown中以特定格式的文字生成流程图或是图标的方法 一种简单的降价式脚本语言 用于通过javascript从文本生成图表 官方文档点这里
  • 【华为OD机试真题】94、猜密码

    文章目录 一 题目 题目描述 输入输出 样例1 二 代码与思路参考 C语言思路 C代码 C 语言思路 C 代码 Java语言思路 Java代码 Python语言思路 Python代码
  • 13-集合框架

    引言 集合框架 理解为集合体系指的是由很多类共同构成 这些类之间存在关系 继承或实现 是成体系的类和接口 一 认识集合 在java程序中 集合是存放数据的容器 它数组一样 但是但是 是存在差异的 从使用上说 集合更为方便 因为集合容量会随着
  • LTP--Linux Test Project

    简介 LTP套件是由 Linux Test Project 所开发的一套系统测试套件 它基于系统资源的利用率统计开发了一个测试的组合 为系统提供足够的压力 通过压力测试来判断系统的稳定性和可靠性 压力测试是一种破坏性的测试 即系统在非正常的
  • element upload限制图片上传格式

    限制图片的格式 html部分 点击选择图片的正常操作是只会出现图片格式 如果选择所有文件 我们就要重新进行验证 在选择照片的时候我们就要进行判断 所以是在on change事件中判断是否为照片格式 先封装一个isImage方法 isImag
  • 【笔试面试真题】Java实现数列还原

    题目描述 牛牛的作业薄上有一个长度为 n 的排列 A 这个排列包含了从1到n的n个数 但是因为一些原因 其中有一些位置 不超过 10 个 看不清了 但是牛牛记得这个数列顺序对的数量是 k 顺序对是指满足 i lt j 且 A i lt A
  • 【JavaWeb】Servlet,Request,Responce

    JavaWeb 核心技术 目录 Tomcat 1 安装配置目录使用部署创建 2 idea集成Tomcat Servlet Servlet快速入门 Servlet生命周期 Servlet体系结构 Servlet urlPattern配置 XM