public HelloServlet() {
System.out.println("构造函数");
}
@Override
public void init() throws ServletException {
System.out.println("初始化");
}
@Override
public void destroy() {
System.out.println("销毁方法");
}
解决中文乱码问题
-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8
//@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(req.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null){
System.out.printf("POST方法 =" + line);
}
reader.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(this.getInitParameter("helloconfig1"));
System.out.println(this.getInitParameter("helloconfig2"));
System.out.println("QueryString = " + req.getQueryString());
resp.getWriter().print(req.getQueryString());
}
}
表单访问
<h4>geth4>
<form action="http://localhost:8080/servlet-demo/hello" method="get">
<input type="text" name="username" value="mickey"><br>
<input type="text" name="password" value="123456"><br>
<input type="submit" value="提交">
form>
<h4>posth4>
<form action="http://localhost:8080/servlet-demo/hello" method="post">
<input type="text" name="username" value="mickey"><br>
<input type="text" name="password" value="123456"><br>
<input type="submit" value="提交">
form>
web.xml
<servlet>
<servlet-name>helloservlet-name>
<servlet-class>com.lxs.demo.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-ModifiedSince");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
属性 | 类型 | 是否必须 | 说明 |
---|---|---|---|
asyncSupported | boolean | 否 | 指定Servlet是否支持异步操作模式 |
displayName | String | 否 | 指定Servlet显示名称 |
initParams | webInitParam[] | 否 | 配置初始化参数 |
loadOnStartup | int | 否 | 标记容器是否在应用启动时就加载这个Servlet,等价于配置文件中的标签 |
name | String | 否 | 指定Servlet名称 |
urlPatterns/value | String[] | 否 | 这两个属性作用相同,指定Servlet处理的url |
<servlet>
<servlet-name>aservlet-name>
<servlet-class>
com.yhp.web.SelectServlet
servlet-class>
<load-on-startup>1load-on-startup>
servlet>
标记容器是否在启动应用时就加载Servlet,默认不配置或数值为负数时表示客户端第一次请求Servlet时再加载;0或正数表示启动应用就加载,正数情况下,数值越小,加载该Servlet的优先级越高
实例://斜杠必须
@WebServlet(value="/test1",loadOnStartup=1)
可以指定也可以不指定,通过getServletName()可以获取到,若不指定,则为Servlet的完整类名,如:cn.edu.njit.servlet.UserServlet
String[]类型,可以配置多个映射,如:urlPatterns={“/user/test”,“/user/example”}
实例://斜杠必须
@WebServlet(loadOnStartup=1,urlPatterns= {"/test1","/test2"})
根元素中不能配置属性metadata-complete=“true”,否则无法加载Servlet。metadata-complete属性表示通知Web容器是否寻找注解,默认不写或者设置false,容器会扫描注解,为Web应用程序构建有效的元数据;metadata-complete=“true”,会在启动时不扫描注解(annotation)。如果不扫描注解的话,用注解进行的配置就无法生效,例如:@WebServlet
<servlet-mapping>
<servlet-name>defaultservlet-name>
<url-pattern>*.jpgurl-pattern>
servlet-mapping>
ServletConfig 类是 Java Servlet API 提供的一个接口,用于提供关于 Servlet 配置信息的访问和管理。每个 Servlet 实例都有其对应的 ServletConfig 实例。
web.xml 中的配置
<servlet>
<display-name>欢迎servletdisplay-name>
<servlet-name>helloservlet-name>
<servlet-class>com.lxs.demo.servlet.HelloServletservlet-class>
<init-param>
<param-name>helloConfig1param-name>
<param-value>hello servlet config value 1param-value>
init-param>
<init-param>
<param-name>helloConfig2param-name>
<param-value>hello servlet config value 2param-value>
init-param>
<load-on-startup>100load-on-startup>
servlet>
Servlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到配置的int-parameter参数
System.out.println(this.getInitParameter("helloConfig1"));
System.out.println(this.getInitParameter("helloConfig2"));
System.out.println("queryString = " + request.getQueryString());
response.getWriter().print("hello servlet response = " +
request.getQueryString());
}
@Override
public void init(ServletConfig config) throws ServletException {
//得到配置的int-parameter参数
super.init(config); //重写后必须写,否则this.getInitParameter方法报错空指针
System.out.println(config.getInitParameter("helloConfig1"));
System.out.println(config.getInitParameter("helloConfig2"));
System.out.println("Hello Servlet 初始化");
}
ServletContext 类是 Java Servlet API 中的一个接口,代表了一个 Web 应用程序的上下文环境。每个 Web 应用程序都有一个对应的 ServletContext 实例,它是在应用程序启动时由 Servlet 容器创建的,并在整个应用程序的生命周期中存在。
HttpServletRequest 类是 Java Servlet API 提供的一个接口,用于表示客户端发出的 HTTP 请求。它提供了访问和操作 HTTP 请求的方法,包括获取请求信息、请求参数、请求头等。
@WebServlet("/request")
public class RequestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("-----------------请求行-----------------------");
//1. 请求行相关的方法
System.out.println("getRequestURI = " + request.getRequestURI());
System.out.println("getRequestURL = " + request.getRequestURL());
System.out.println("getMethod = " + request.getMethod());
System.out.println("getProtocol()" + request.getProtocol());
System.out.println("-----------------请求头-----------------------");
//请求头
Enumeration<String> heads = request.getHeaderNames();
while (heads.hasMoreElements()) {
String h = heads.nextElement(); //请求头的名字
String v = request.getHeader(h); //值
System.out.println(h + ": " + v);
}
System.out.println("-----------------请求体-----------------------");
//请求体
// BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream()));
// System.out.println(in.readLine());
//请求参数
System.out.println("username = " +
request.getParameter("username")); //得的get和post的参数
System.out.println("password = " +
request.getParameter("password"));
//多个同名参数得到数组
String[] ids = request.getParameterValues("ids");
System.out.println("ids = " + Arrays.toString(ids));
System.out.println("--------------");
//得到所有的参数
Map<String, String[]> paramMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry : paramMap.entrySet()) {
System.out.println("key = " + entry.getKey() + " value = " +
Arrays.toString(entry.getValue()));
}
System.out.println("--------------");
//得到所有的参数名
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
String n = names.nextElement(); //请求头的名字
String v = request.getParameter(n);
System.out.println(n + ": " + v);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
get的默认编码utf-8,以前老版本tomcat中get编码是iso-8859-1
// 获取请求参数
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
//2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
// 设置请求体的字符集为 UTF-8, 从而解决 post 请求的中文乱码问题
req.setCharacterEncoding("UTF-8");
System.out.println("-------------doPost------------");
// 获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名: " + username);
System.out.println("密码: " + password);
System.out.println("兴趣爱好: " + Arrays.asList(hobby));
}
请求转发是指, 服务器收到请求后, 从一次资源跳转到另一个资源的操作叫请求转发。
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在Servlet1(柜台1)中查看参数(材料):" + username);
// 给材料 盖一个章,并传递到Servlet2(柜台 2)去查看
req.setAttribute("key1","柜台1的章");
// 问路:Servlet2(柜台 2)怎么走
/**
* 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射
到IDEA代码的web目录
*
*/
RequestDispatcher requestDispatcher =
req.getRequestDispatcher("/servlet2");
// RequestDispatcher requestDispatcher =
req.getRequestDispatcher("http://www.baidu.com");
// 走向Sevlet2(柜台 2)
requestDispatcher.forward(req,resp);
}
}
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数(办事的材料)查看
String username = req.getParameter("username");
System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username);
// 查看 柜台1 是否有盖章
Object key1 = req.getAttribute("key1");
System.out.println("柜台1是否有章:" + key1);
// 处理自己的业务
System.out.println("Servlet2 处理自己的业务 ");
}
}
request:在一次请求中可以访问的作用,当前的servlet和当前servlet转发的servlet可以访问
//request作用域存
request.setAttribute("requestKey3", "hello servlet3 attribute value1");
//request作用域取
request.getAttribute("requestKey3")
HttpServletResponse 类是 Java Servlet API 提供的一个接口,用于表示服务器对客户端发起的 HTTP 请求所做出的响应。它提供了访问和操作 HTTP 响应的方法,包括设置响应状态、设置响应头、向客户端发送数据等。
@WebServlet("/response")
public class ResponseServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8"); //设置响应字符集的响应头
System.out.println("-----------------响应行-----------------------");
response.setStatus(HttpServletResponse.SC_OK);
// response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
//重定向到500
System.out.println("-----------------响应头-----------------------");
response.addHeader("user-name", "mickey");
System.out.println("-----------------响应体-----------------------");
response.getWriter().print("hello response body-- 中文响应体");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
方案一:
// 设置服务器字符集为 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");
请求重定向, 是指客户端给服务器发请求, 然后服务器告诉客户端说。 我给你一些地址。 你去新地址访问。 叫请求重定向(因为之前的地址可能已经被废弃)
请求重定向方案一:
// 设置响应状态码 302 , 表示重定向, (已搬迁)
resp.setStatus(302);
// 设置响应头, 说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");
请求重定向方案二:
resp.sendRedirect("http://localhost:8080");