Servlet基础——01

Servlet

1.Tomcat服务器

​ Tomcat 是一个符合 JavaEE WEB 标准的最小的WEB 容器,所有的 JSP 程序一定要有 WEB 容器的支持才能运行,而且在给定的 WEB 容器里面都会支持事务处理操作。

2.Servlet的实现

  1. ​ 安装Tomcat 或者免安装版直接解压

  2. ​ IDEA配置Tomcat

  3. ​ 创建Web项目

3.实现 Servlet 规范

​ 实现 Servlet 规范,即继承 HttpServlet 类,并到如响应的包,该类中已经完成了通信的规则,我们只需要进行业务的实现即可

  1. 继承HttpServlet 类 遵循servlet标准(继承 HttpServlet)
  2. 重写 service 方法 重写service方法(当前Servlet 类被访问时自动调用service方法)
  3. 设置注解 设置对外访问的路径 (设置@WebServlet("/路径"))
package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class Servlet01 extends HttpServlet {
     @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello servlet");
        System.out.println("你好 servlet");
    }   
}

4.Servlet的生命周期

4.1 实例和初始化时机

当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。

当资源被访问时自动调用初始化方法 调用时只执行一次

4.2 就绪/调用/服务阶段

有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用; HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是,这两个 do 方法默认情况下,会抛出异常,需要子类去 override。

4.3 销毁时机

当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁

5.HttpServletRequest对象

5.1 接收请求的常用方法
// 获取客户端请求的完整URL (从http开始,到?前面结束)
        String url = request.getRequestURL().toString();
        System.out.println("获取客户端请求的完整URL:" + url);
        //  获取客户端请求的部分URL (从站点名开始,到?前面结束)
        String uri = request.getRequestURI();
        System.out.println("获取客户端请求的部分URI:" + uri);
        // 获取请求行中的参数部分
        String queryString = request.getQueryString();
        System.out.println("获取请求行中的参数部分:" + queryString);
        // 获取客户端的请求方式
        String method = request.getMethod();
        System.out.println("获取客户端的请求方式:" + method);
        // 获取HTTP版本号
        String protocol = request.getProtocol();
        System.out.println("获取HTTP版本号:" + protocol);
        // 获取webapp名字 (站点名)
        String webapp = request.getContextPath();
        System.out.println("获取webapp名字:" + webapp);


//获取参数
        // 获取指定名称的参数,返回字符串
        String uname = request.getParameter("uname");
        System.out.println("uname的参数值:" + uname);
        // 获取指定名称参数的所有参数值,返回数组
        String[] hobbys = request.getParameterValues("hobby");
        System.out.println("获取指定名称参数的所有参数值:" + Arrays.toString(hobbys));
5.2 请求乱码问题

5.2.1 Request请求乱码

原因:

​ 目前使用的是默认的编码格式(ISO-8859-1),此编码格式不支持中文

Get

​ tomcat7版本以及之前版本 会出现乱码

​ tomcat8版本以上版本 不会出现乱码

解决方式:

​ new String(request.getParameter(“参数”).getBytes(“ISO-8859-1”),“UTF-8”);

Post

​ tomcat7版本以及之前版本 会出现乱码

​ tomcat8版本以上版本 会出现乱码

解决方案:

​ 1.new String(request.getParameter(“参数”).getBytes(“ISO-8859-1”),“UTF-8”);

​ 2.request.setCharacterEncoding(“UTF-8”);

5.3 请求转发

​ 服务端行为,页面中的饿url地址栏不发生改变,内容变化,从始至终只有一次请求
​ 请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出

 		//获取参数
        String uname = request.getParameter("uname");
        System.out.println(uname);

        //请求转发到页面
        if(uname.equals("admin")){
            request.getRequestDispatcher("index.html").forward(request,resp);
        }else{
            request.getRequestDispatcher("login.jsp").forward(request,resp);
        }
5.4 request作用域

​ 通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。

​ 一般用于前后台交互,后台响应数据给客户端(设置域对象),客户端获取域对象显示数据(获取域对象)

5.4.1 设置域对象内容

request.setAttribute(String name, String value);

5.4.2 获取域对象内容

request.getAttribute(String name);

5.4.3 删除域对象内容

request.removeAttribute(String name);

6.HttpServletResponse对象

6.1 响应数据

​ getWriter(); 得到字符流(只能输出字符)

​ getOutputStream(); 得到字节流(可以输出任意内容)

​ 只有使用其中一个,不能同时使用两个

6.2 乱码问题

response对象乱码问题

原因:

​ getWriter(); 得到字符流(只能输出字符)

​ 会出现乱码问题 写出的编码格式默认是ISO-8859-1,不具备使用中文功能

​ getOutputStream(); 得到字节流(可以输出任意内容)

​ 可能会出现乱码问题 需要让客户端的编码格式与服务端的编码格式一致

解决方案:

​ 设置服务端的编码格式
response.setCharacterEncoding(“UTF-8”);
​ 设置客户端的编码格式
response.setHeader(“content-type”,“text/html;charset=utf-8”);

​ 上面两个一起使用

​ 同时设置客户端和服务端的编码格式
​ response.setContentType(“text/html;charset=utf-8”);

6.3 response 重定向

​ 与request请求转发之间的区别

​ 1.请求转发是服务端行为,重定向是客户端行为

​ 2.请求转发地址栏不发生改变,重定向会发生改变

​ 3.请求转发地址栏发送 1次请求,重定向会发送 2次请求

​ 4.请求转发的数据(requset)可以共享,重定向不共享数据

​ 5.请求转发的起始路径是从当前项目开始的,所以不能跳转到百度以及外网

重定向的起始路径是http://开始的,所以跳转到百度以及外网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值