Servlet笔记
- Servlet是一种用Java编写的服务器端程序,主要用于交互式地浏览和修改数据,生成动态Web内容(以前需要用main方法执行,现在想通过浏览器访问,让浏览器可以通过一个地址访问到我,我再去调用对应的方法。)。Servlet的生命周期包括客户端请求、加载Servlet类到内存、实例化并调用init()方法进行初始化、处理请求(通过service()方法或其对应的具体方法如doGet()、doPost()等)以及最终的destroy()方法进行资源清理。这些操作通常是动态执行的,服务器可以在启动时提供选项来强制装载和初始化特定的Servlet实例。
- servlet本质上也是java类,但是要遵循servlet规范(继承HttpServlet类(jar包在tomcat里面))编写。由servlet容器编写。servlet和http紧密相连,可以处理http协议相关的所有内容。提供了servlet功能的服务器servlet容器(tomcat)。
- servlet的生命周期,什么时候创建(当请求到达容器时,容器查找改Servlet对象是否存在,如果不存在,创建并实例化,方法只执行一次),什么时候调用(容器调用Servlet的service方法,并更具http请求方式调用对应方法),什么时候销毁(容器关闭时销毁)。(init方法,service方法,destroy方法:在特定时机容器自动调用)
-
乱码
req.setCharacterEncoding("UTF-8");
new String(req.getParameter("uname").getBytes("ISO-8859-1"), "UTF-8")
针对任何请求,但是如果数据本身不乱码,仍然使用new String()转换,则会乱码。(tomcat8及以上)
login.jsp<%-- Created by IntelliJ IDEA. User: HP Date: 2024/7/9 Time: 13:46 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登陆</title> </head> <body> <form method="post" action="S02"> 姓名<input type="text" name="uname"/> 密码<input type="password" name="upwd"/> <button>登录</button> </form> </body> </html>
servlet2
package com.example.zlp; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/S02") public class Servlet2 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String uname=req.getParameter("uname"); String upwd=req.getParameter("upwd"); System.out.println("uname:"+uname+" upwd:"+upwd ); } }
- 请求转发
Servlet03.java
package com.example.zlp; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /* 请求转发跳转req.getRequestDispatcher(url).forward(req,resp); 可以让请求跳转到客户端或者servlet http://localhost:8080/S1/S03?uname=wo&upwd=123 特定:1.服务端行为,客户端请求到达后,服务器进行转发,此时会将请求对象进行保存。2.地址栏不发生改变。3.从始至终只有一个请求。4.request数据可以共享 */ @WebServlet("/S03") public class Servlet03 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //接受参数 String uname=req.getParameter("uname"); String upwd=req.getParameter("upwd"); System.out.println("Servlet03 uname:"+uname+" upwd:"+upwd ); //请求转发跳转到Servlet04 // req.getRequestDispatcher("S04").forward(req,resp); //请求转发跳转到jsp页面 req.getRequestDispatcher("login.jsp").forward(req,resp); } }
package com.example.zlp; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /* 请求转发跳转 可以让请求跳转到客户端或者servlet 服务端行为 */ @WebServlet("/S04") public class Servlet04 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //接受参数 String uname=req.getParameter("uname"); String upwd=req.getParameter("upwd"); System.out.println("Servlet04 uname:"+uname+" upwd:"+upwd ); } }
- request作用域:在一个请求中传递数据,在请求转发中可以通过request来传输/共享数据,setAttribute,getAttribute,removeAttribute。在第一个servlet中set,在请求转发的servlet或者jsp中get。
- response:向客户端输出数据,对客户端请求进行响应,并将处理结果返回客户端。
getWriter(),getOutputStream()
package com.example.zlp; import jakarta.servlet.ServletException; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/S05") public class Servlet05 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //字符输出流 // PrintWriter writer=resp.getWriter(); // writer.write("hello"); //字节输出流 ServletOutputStream outputStream= resp.getOutputStream(); outputStream.write("hi".getBytes()); //不能同时使用(会报错),getWriter已经使用了response对象了 } }
- 响应乱码
package com.example.zlp; import jakarta.servlet.ServletException; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/S05") public class Servlet05 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务端默认编码格式是ISO-8859-1,不支持中文 // 设置服务端编码格式 //resp.setCharacterEncoding("UTF-8"); //设置客户端编码格式和响应的MIME类型 //resp.setHeader("content-type","text/html;charset=UTF-8"); //同时设置客户端和服务端的编码格式 resp.setContentType("text/html;charset=UTF-8"); //字符输出流 // PrintWriter writer=resp.getWriter(); // writer.write("<h2>你好</h2>"); //字节输出流 ServletOutputStream outputStream= resp.getOutputStream(); outputStream.write("<h2>你好</h2>".getBytes("UTF-8")); //不能同时使用(会报错),getWriter已经使用了response对象了 } }
-
重定向:是一种服务端指导,客户端行为,客户端发出请求被服务器接受处理,之后进行响应,同时会给客户端一个新的地址,当接收到响应后,马上会根据第二个新地址发出请求,服务端接收请求并响应,重定向完成。
response.sendRedirect("index.jsp");
请求转发和重定向的区别
请求转发 重定向 一次请求,request对象共享 两次请求,request对象不共享 服务端行为 客户端行为 地址栏不改变 地址栏发生改变 绝对地址定位到站点后 绝对地址定位到http://