栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

javaweb之Servlet(总体第六篇)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

javaweb之Servlet(总体第六篇)

一、详细学习内容 1、servlet技术 (1)什么是Servlet

servlet是javaEE规范之一,其实就是一个接口Servlet是javaweb三大组件之一,三大组件分别是Servlet程序,Filter过滤器,Listen监听器Servlet是运行在服务器上的java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端 (2)写一个Servlet程序

1、编写一个类实现Servlet接口
2、实现service方法,处理请求,并响应数据
3、到web.xml中去配置servlet程序访问地址

创建项目

编写类实现接口

配置web.xml

结果

(3)理解登录流程


首先我们写了自己的web项目,就是有了一个helloServlet的程序,它就做为整个项目,然后它会发布到Tomcat作为服务器,然后你就可以访问了。

(4)Servlet生命周期

1、首先执行Servlet构造器方法2、执行init初始化方法3、执行service方法【每次访问都会调用】4、执行destroy销毁方法
方法1,2是在第一次访问的时候访问。 (5)理解doGet和doPost方法

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class hello implements Servlet {
    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws
            ServletException, IOException {
        System.out.println("3 service === Hello Servlet 被访问了");
// 类型转换(因为它有 getMethod()方法)
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
        String method = httpServletRequest.getMethod();
        if ("GET".equals(method)) {
            doGet();
        } else if ("POST".equals(method)) {
            doPost();
        }
    }

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

    @Override
    public void destroy() {

    }

    
    public void doGet(){
        System.out.println("get 请求");
        System.out.println("get 请求");
    }

    
    public void doPost(){
        System.out.println("post 请求");
        System.out.println("post 请求");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
}
(6)通过继承HTTPServlet实现Servlet

看一下继承关系

public class HelloServlet2 extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        System.out.println("doGet方法");
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        System.out.println("doPost 方法");
    }
}

同样的配置web.xml文件 (7)通过idea创建servlet


(8)Servlet类继承关系

2、ServletConfig类

是Servlet的配置类Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用Servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig (1)ServletConfig类的三大作用

获取Servlet程序的别名servlet-name的值获取初始化参数init-param获取ServletContext对象


        
        HelloServlet
        
        cn.mldn.servlet2.servlet3.HelloServlet2
        
        
            
            username
            
            root
        
        
        
            
            url
            
            jdbc:mysql://localhost:3306/test
        
    
    
    
        HelloServlet
        /hello
    

servlet标签给Tomcat配置Servlet程序servlet-mapping是配置访问的路径servlet-name是标签servlet程序起一个别名(一般是类名)

@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init 初始化方法");
// 1、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
// 2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}

3、ServletContext类 (1)什么是ServletContext类

ServletContext 是一个接口,它表示 Servlet 上下文对象一个web工程,只是一个servletContex对象的实例servletContext对象时一个域对象servletContext是在web工程部署启动的时候创建,在web工程时候销毁 (2)什么是域对象

什么是域对象?域对象,是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个 web 工程。存数据就用put()方法,setAttribute(),而取对象则是get(),getAttribute()实现,然后可以删除数据remove(),removeAttribute()

其实这个很好理解,比如说我们把前端项目看成一个域对象,我后端给你一个cookie,然后你保存下来,存起来,全局整个前端都是共享这部分数据的。 (3)ServletContext类的作用

获取web.xml中配置的上下文参数context-param获取当前的工程路径,格式:/工程路径获取工程部署后再服务器硬盘上的绝对路径想Map一样存数据

public class HelloServlet2 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
// 1、获取 web.xml 中配置的上下文参数 context-param
        ServletContext context = getServletConfig().getServletContext();
        String username = context.getInitParameter("username");
        System.out.println("context-param 参数 username 的值是:" + username);
        System.out.println("context-param 参数 password 的值是:" +
                context.getInitParameter("password"));
// 2、获取当前的工程路径,格式: /工程路径
        System.out.println( "当前工程路径:" + context.getContextPath() );
// 3、获取工程部署后在服务器硬盘上的绝对路径

        System.out.println("工程部署的路径是:" + context.getRealPath("/"));
        System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
        System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        System.out.println("doPost 方法");
    }
}

这个比较重要,到时候在开发中用比较多,到时候我们可以存在Redis里面,方便存取。



username
context



password
root

public class ContextServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// 获取 ServletContext 对象
ServletContext context = getServletContext();
System.out.println(context);
System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
context.setAttribute("key1", "value1");
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
}
4、HTTP协议

http协议就是客户端和服务器之间通信时,发送数据需要遵守的规则。

(1)请求HTTP协议格式

http://localhost:8083/helloservlet_war_exploded/hello

客户端发送消息叫请求
服务器回应消息叫回应

(2)请求的类型

HTTP拥有如下请求:GET POST HEAD PUT DELETE ConNECT TRACE OPTIONS
常用的请求如下请求:GET,POST请求

Get请求:请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用base64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。


POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
例子就是我们自己编写的表单。

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

(3)常见的请求头

Accept:表示客户端可以接受的数据类型Accept-Languege:表示客户端可以接受的语言类型User-Agent:表示客户端浏览器的信息Host:表示请求时的服务器ip地址


(4)响应的Http协议格式

响应行
(1) 响应的协议和版本号
(2) 响应状态码
(3) 响应状态描述符响应头
(1) key : value 不同的响应头,有其不同含义
空行响应体 ---->>> 就是回传给客户端的数

常见的响应码

200:请求成功302:表示请求重定向404:表示请求服务器已经收到了,但是你要的数据不存在500:表示服务器已经收到请求,但是服务器内容错误。 (5)MIME类型说明

MIME:是HTTP协议中数据类型

MIMEden英文全称是Multipurpose Internet Mail Extension多功能Internet邮件扩充服务,MIME类型的格式是“大类型/类型”,并与某一种文件的扩展名相对应。

用浏览器查看一下

二、请求头和响应头总结 1、请求头


2、响应头



3、以请求哔站的是链接分析

响应头


三、HttpServletRequest和HttpServletResponse 1、HTTPServletRequest (1)HTTPServletRequest的作用

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
信息

(2)常用 的API

getRequestURI():获取请求的资源路径

getRequestURL():获取请求的统一资源定位符

getRemoteHost():获取客户端的ip地址

getHeader():获取请求头

getParameter():获取请求的参数

getParameterValues()获取请求的参数,多个值的时候用

getMethods():获取请求的方法get或者post

setAttribute(key,value):设置域数据

getAttribute(key):获取域数据

getRequestDispatcher():或者请求转发对象

案例分析

(3)获取请求的参数


(4)解决POST请求中文乱码问题

(5)请求转发

什么是请求转发?
请求就是请求,转发就是服务器接受到请求之后,从一次资源跳转到另一个资源的操作叫做请求转发。

(6)base标签作用

(7)web中/再用用

在web中/是一种绝对路径/如果被浏览器解析,得到的地址是会是:http://ip:端口号/工程路径/如果被服务器解析,得到的是:http://ip:duankouhao/工程路径 2、HTTPServletResponse (1)HTTPServletResponse作用

HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置

(2)返回的方式

字符流:getOutputStream(),常用于下载(传递二进制数据)字符流:getWriter(),常用于回传字符串

上面两同时只能用一个。

(3)如果给客户端返回数据


而且这个是java的里面的数据流的操作格式,最后要关闭流的传输。

(4)解决响应的乱码问题

// 设置服务器字符集为 UTF-8

resp.setCharacterEncoding(“UTF-8”);

// 通过响应头,设置浏览器也使用 UTF-8 字符集

resp.setHeader(“Content-Type”, “text/html; charset=UTF-8”

// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效

resp.setContentType(“text/html; charset=UTF-8”); (5)请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。

视频学习地址:哔哩哔哩尚硅谷课程

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777857.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号