JavaWeb-servlet6中request和response的使用

发布于:2025-03-13 ⋅ 阅读:(33) ⋅ 点赞:(0)
HttpServletRequest

HttpServletRequest 继承自 ServletRequest。客户端浏览器发出的请求被封装成为一个 HttpServletRequest对象。
对象包含了客户端请求信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。

获得客户机信息
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String requestUrl = request.getRequestURL().toString();// 得到请求的URL地址
        String requestUri = request.getRequestURI();// 得到请求的资源
        String queryString = request.getQueryString();// 得到请求的URL地址中附带的参数
        String remoteAddr = request.getRemoteAddr();// 得到来访者的IP地址
        int remotePort = request.getRemotePort(); // 得到来访者的端口
        String method = request.getMethod();// 得到请求URL地址时使用的http方式
        String localAddr = request.getLocalAddr();// 获取WEB服务器的IP地址
        String localName = request.getLocalName();// 获取WEB服务器的主机名
        response.setCharacterEncoding("UTF-8");// 设置将字符以"UTF-8"编码输出到客户端浏览器
        // 通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
        response.setHeader("content-type", "text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.write("获取到的客户机信息如下:");
        out.write("<hr/>");
        out.write("请求的URL地址:" + requestUrl + "<br/>");
        out.write("请求的资源:" + requestUri + "<br/>");
        out.write("请求的URL地址中附带的参数:" + queryString + "<br/>");
        out.write("来访者的IP地址:" + remoteAddr + "<br/>");
        out.write("使用的端口号:" + remotePort + "<br/>");
        out.write("使用的http方式:" + method + "<br/>");
        out.write("localAddr:" + localAddr + "<br/>");
        out.write("localName:" + localName + "<br/>");
        out.close();
    }
获得客户机请求头
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");// 设置将字符以"UTF-8"编码输出到客户端浏览器
        // 通过设置响应头控制浏览器以UTF-8的编码显示数据
        response.setHeader("content-type", "text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Enumeration<String> reqHeadInfos = request.getHeaderNames();// 获取所有的请求头
        out.write("获取到的客户端所有的请求头信息如下:");
        out.write("<hr/>");
        while (reqHeadInfos.hasMoreElements()) {
            String headName = (String) reqHeadInfos.nextElement();
            // 根据请求头的名字获取对应的请求头的值
            String headValue = request.getHeader(headName);
            out.write(headName + ":" + headValue);
            out.write("<br/>");
        }
        out.write("<br/>");
        out.write("获取到的客户端Accept-Encoding请求头的值:");
        out.write("<hr/>");
        String value = request.getHeader("Accept-Encoding");// 获取Accept-Encoding请求头对应的值
        out.write(value);
        Enumeration<String> e = request.getHeaders("Accept-Encoding");
        while (e.hasMoreElements()) {
            String string = (String) e.nextElement();
            System.out.println(string);
        }
    }
使用 getParameter() 和 getParameterValues() 接收表单参数
@WebServlet(name = "save", urlPatterns = "/save")
public class FormServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 客户端是以UTF-8编码提交表单数据的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String[] insts = request.getParameterValues("inst");
        String instStr = Arrays.toString(insts);
        String htmlStr = "<p>用户名:" + username + "</p>"
                + "<p>密码:" + password + "</p>"
                + "<p>爱好:" + instStr + "</p>";
        // 设置服务器端以UTF-8编码输出数据到客户端
        response.setCharacterEncoding("UTF-8");
        // 设置客户端浏览器以UTF-8编码解析数据
        response.setContentType("text/html;charset=UTF-8");
        // 输出htmlStr里面的内容到客户端浏览器显示
        response.getWriter().write(htmlStr);
    }
}
request中文参数乱码

以POST方式提交表单中文参数的乱码问题
客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码。具体如下:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
   request.setCharacterEncoding(UTF-8); 
   //解决post提交服务端乱码
    String userName = request.getParameter("userName");
 }

以GET方式提交表单中文参数的乱码问题
对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的,默认的还是使用ISO8859-1这个字符编码来接收数据

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        String name = request.getParameter("name");
        //接收数据
        name =new String(name.getBytes(), "UTF-8") ;
}
HttpServletResponse

HttpServletResponse 接口继承自 ServletResponse 接口,主要用于封装 HTTP 响应消息。由于 HTTP 响应消息分为状态行、响应消息头、消息体三部分。因此,在 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。

Response主要的作用有以下几点:
负责向客户端(浏览器)发送数据
负责向客户端(浏览器)发送响应头
负责向客户端(浏览器)发送响应状态码
封装响应状态码的常量

使用OutputStream流向客户端浏览器输出"中国"这两个汉字
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data = "中国";
        // 获取OutputStream输出流
        OutputStream outputStream = response.getOutputStream();
        // 通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
        response.setHeader("content-type", "text/html;charset=UTF-8");
        // 将字符转换成字节数组,指定以UTF-8编码进行转换
        byte[] array = data.getBytes("UTF-8");
        // 使用OutputStream流向客户端输出字节数组
        outputStream.write(array);
    }
使用PrintWriter流向客户端浏览器输出"中国"这两个汉字
@Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data = "中国";
        response.setCharacterEncoding("UTF-8");// 设置将字符以"UTF-8"编码输出到客户端浏览器
        PrintWriter out = response.getWriter();// 获取PrintWriter输出流
        out.write(data);// 使用PrintWriter流向客户端输出字符
        out.close();
    }
ServletContext对象

ServletContext 又叫做 Servlet 上下文。

当Web服务器启动时,容器会为每一个Web应用程序创建一块共享的存储区域。ServletContext也叫做“公共区域”,也就是同一个WEB应用程序中,所有的Servlet和JSP都可以共享同一个区域。

ServletContext在WEB服务器启动时创建,服务器关闭时销毁。

Servlet对象中维护了 ServletContext 对象的引用,开发人员在编写servlet时,可以通过this.getServletContext() 方法获得 ServletContext 对象。

由于一个 Web 应用中的所有 Servlet 共享同一个 ServletContext 对象,因此 Servlet 对象之间可以通过ServletContext 对象来实现通讯。ServletContext 对象通常也被称之为 context 域对象。

ServletContext 数据共享

创建两个servlet类Servlet1.java和Servlet2.java。Servlet1将数据存储到ServletContext对象中,Servlet2从ServletContext对象中取出数据,从而实现数据共享。

@WebServlet(name = "servlet1", urlPatterns = "/servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String company = "isoftstone";
        ServletContext context = this.getServletConfig().getServletContext();// 获得ServletContext对象
        context.setAttribute("company", company); // 将data存储到ServletContext对象中
    }
}
@WebServlet(name = "servlet2", urlPatterns = "/servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ServletContext context = this.getServletContext();
        String company = (String) context.getAttribute("company");// 从ServletContext对象中取出数据
                response.getWriter().print("company = " + company);
    }
}
ServletContext 初始化参数

1、在web.xml中加入初始化参数:

<context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>

2、在Servlet类中调用该参数:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ServletContext context = this.getServletContext();
        // 获取整个web站点的初始化参数
        String contextInitParam = context.getInitParameter("url");
        response.getWriter().print(contextInitParam);
}