JavaEE servlet开发及解决servlet请求和响应的乱码问题

本文介绍了Servlet在Java EE中的核心作用,区分了静态和动态资源,并详细讲解了HttpServletRequest和HttpServletResponse对象的使用,包括获取请求信息、响应设置和解决乱码技巧。
摘要由CSDN通过智能技术生成

Servlet介绍

Servlet是Server Applet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。Web容器或应用服务器实现了Servlet标准所以Servlet需运行在Web容器或应用服务器中。Servlet主要功能在于能在服务器中执行并生成数据。Servlet使用单进程多线程方式运行。Servlet是可以接受Http请求并作出相应的一种技术,是JAVA语言编写的一种动态资源,Servlet是前后端衔接的一种技术,不是所有的JAVA类都可以接收请求和作出相应,在MVC模式中,Servlet作为Controller层(控制层)主要技术,用于和浏览器完成数据交互,控制交互逻辑

静态资源和动态资源

静态资源: 每次访问都不需要运算,直接就可以返回的资源, 如HTML CSS JS 多媒体文件等等,每次访问获得的资源都是一样的

动态资源: 每次访问都需要运算代码生成的资源,如Servlet JSP ,每次访问获得的结果可能都是不一样的,Servlet作为一种动态资源技术,是我们后续学习框架的基础

HttpServletRequest对象

HttpServletRequest对象代表客户端浏览器的请求,当客户端浏览器通过HTTP协议访问服务器时,HTTP请求中的所有信息都会被Tomcat所解析并封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

1.获取请求行信息

req.getRequestURL()://返回客户端浏览器发出请求时的完整URL。
req.getRequestURI()://返回请求行中指定资源部分。
req.getRemoteAddr()://返回发出请求的客户机的IP地址。
req.getLocalAddr()://返回WEB服务器的IP地址。
req.getLocalPort()://返回WEB服务器处理Http协议的连接器所监听的端口。

2.获取请求头信息

req.getHeader("headerKey")://根据请求头中的key获取对应的value。
String headerValue = req.getHeader("headerKey");
req.getHeaderNames()://获取请求头中所有的key,该方法返回枚举类型。
Enumeration<String> headerNames = req.getHeaderNames();
public class Servlet3 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req.getRequestURL());//返回客户端浏览器发出请求时的完整URL。
        System.out.println(req.getRequestURI());//返回请求行中指定资源部分。
        System.out.println(req.getRemoteAddr());//返回发出请求的客户机的IP地址。
        System.out.println(req.getLocalAddr());//返回WEB服务器的IP地址。
        System.out.println(req.getLocalPort());//返回WEB服务器处理Http协议的连接器所监听的端口。
        System.out.println("主机名: " + req.getLocalName());
        System.out.println("客户端PORT: " + req.getRemotePort());
        System.out.println("当前项目部署名: " + req.getContextPath());
        System.out.println("协议名:"+req.getScheme());
        System.out.println("请求方式:"+req.getMethod());

        // 根据请求头名或者请求头对应的值
        System.out.println(req.getHeader("Accept"));
        // 获得全部的请求头名
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String headername = headerNames.nextElement();
            System.out.println(headername+":"+req.getHeader(headername));
        }
    }
}

3.获取请求数据

在Servlet获取请求数据的方式:

req.getParameter("key")://根据key获取指定value。
String str = req.getParameter("key");

获取复选框(checkbox组件)中的值:

eq.getParameterValues("checkboxkey")://获取复选框(checkbox组件)中的值,返回一个String[]String[] userlikes = req.getParameterValues("checkboxkey");

获取所有提交数据的key:

req.getParameterNames()://获取请求中所有数据的key,该方法返回一个枚举类型。
Enumeration<String> parameterNames = req.getParameterNames()

使用Map结构获取提交数据:

req.getParameterMap()://获取请求中所有的数据并存放到一个Map结构中,该方法返回一个Map,其中key为String类型value为String[]类型。
Map<String, String[]> parameterMap = req.getParameterMap();

设置请求编码:

req.setCharacterEncoding("utf-8")

请求的数据包基于字节在网络上传输,Tomcat接收到请求的数据包后会将数据包中的字节转换为字符。在Tomcat中使用的是ISO-8859-1的单字节编码完成字节与字符的转换,所以数据中含有中文就会出现乱码,可以通过req.setCharacterEncoding(“utf-8”)方法来对提交的数据根据指定的编码方式重新做编码处理。

HttpServletResponse对象

HttpServletResponse对象代表服务器的响应。这个对象中封装了响应客户端浏览器的流对象,以及向客户端浏览器响应的响应头、响应数据、响应状态码等信息。

响应的设置

ContentType响应头:

resp.setContentType("MIME")://该方法可通过MIME-Type设置响应类型。

设置字符型响应

// 设置响应类型为文本型,内容含有html字符串,是默认的响应类型
resp.setContentType("text/html"):
// 设置响应类型为文本型,内容是普通文本。
resp.setContentType("text/plain"):
// 设置响应类型为JSON格式的字符串。
resp.setContentType("application/json"):

设置字节型响应

// 设置响应类型为图片类型,图片类型为jpeg或jpg格式。
resp.setContentType("image/jpeg"):
// 设置响应类型为图片类型,图片类型为gif格式。
resp.setContentType("image/gif"):

设置响应编码

// 设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换为字节。
response.setCharacterEncoding("utf-8");
// 设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换为字节。同时客户端浏览器会根据此编码方式显示响应内容。
response.setContentType("text/html;charset=utf-8");

在响应中添加附加信息(文件下载)

// 在实现文件下载时,我们需要修改响应头,添加附加信息。
response.setHeader("Content-Disposition",   "attachment; filename="+文件名);

Content-Disposition:attachment, 该附加信息表示作为对下载文件的一个标识字段。不会在浏览器中显示而是直接做下载处理。
filename=文件名, 表示指定下载文件的文件名。

解决文件下载中文件名中文乱码问题:

resp.addHeader("Content-Disposition","attachment;filename="+new String (file.getName().getBytes("gbk"),"iso-8859-1"));

响应代码测试

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

public class MyServlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置响应码
        //resp.setStatus(500);
        //resp.setStatus(405, "request method not supported");
        // 设置响应头
        //resp.setHeader("Date","2022-11-11");
        // 自定义头
        // resp.setHeader("aaa", "bbb");
        // 高速浏览器响应的数据是什么? 浏览器根据此头决定 数据如何应用
        // 设置MIME类型 json  xml 文件下载  ... ...
        // resp.setHeader("content-type", "text/css");
        resp.setContentType("text/html");// 专门用于设置Content-Type 响应头
        resp.getWriter().write("<h1>this is tag h1</h1>");
    }
}

解决请求和响应乱码:

1.控制台乱码
设置Tomcat中 conf下logging.properties中所有的UTF-8编码为GBK即可

2.post请求乱码
通过HttpServletRequest设置请求编码

 /*处理post请求乱码*/
  req.setCharacterEncoding("UTF-8");

3.get请求乱码
需要手动进行编码解码,或者设置tomcat中的server.xml中的URI编码,或者更换Tomcat版本为9.0以上

   <Connector port="8080" protocol="HTTP/1.1"
  	 connectionTimeout="20000" 
 	 redirectPort="8443" URIEncoding="utf-8"/>

4.响应乱码
通过HttpServletResponse设置响应编码

  //以UTF-8编码处理数据
  resp.setContentType("UTF-8");
  //设置响应头,以便浏览器知道以何种编码解析数据
  resp.setContentType("text/html;charset=UTF-8");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值