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");