Java web—Servlet的请求与响应
前言:
在家上网课快上疯了╰(‵□′)╯,上课连课本都没有,太难受了呜呜呜~, 只能在blog里记录一下这段时间的学习的内容,太难了…
一、servlet概述:
- 运行在WEB服务器端的一个JAVA小程序,也就是一个Java类。
- 一个用来被用户访问的动态资源。
- 通常把实现了Servlet接口的java类统称为Servlet。
- 编写好的Servlet需要在web.xml文件中做配置才能供外界访问。
二、servlet的作用:
- 用于处理客户端传来的HTTP请求,并返回一个响应
- 它能够处理的请求有
doGet()
和doPost()
等方法。
三、servlet体系结构:
- Servlet由Servlet容器提供
- Servlet容器是指提供了Servlet 功能的服务器(这里指Tomcat)
- Servlet容器将Servlet动态的加载到服务器上。
- Servlet的请求首先会被HTTP服务器接收,HTTP服务器只负责静态HTML页面的解析。
- Servlet的请求转交给Servlet容器,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet。
- Servlet将处理的结果返回给Servlet容器,并通过HTTP服务器将响应传输给客户端。
四、创建servlet的三种方式:
- 直接实现Servlet接口
- 继承GenericServlet类
- 继承HttpServlet类(常用)
其中关系如下:
五、servlet生命周期的三个方法:
- init():首次访问这个Servlet,Servlet对象会被创建,执行初始化方法。只执行一次。
init(ServletConfig config):
其中的config就是ServletConfig接口对象。
- service() :响应客户端请求。每次访问Servlet,都会被执行
service(ServletRequest request,
ServletResponse response)
- destroy() :服务器正常关闭后,会执行该方法 ,只执行一次。
public void destroy()
六、配置web.xml文件:
编写好的Servlet需要在web.xml文件中做配置才能供外界访问,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet
例:
<web-app>
<servlet>
<servlet-name> FirstServlet </servlet-name> //为了方便使用Servlet,取的别名
<servlet-class> pdsu.edu.cn.hm.HelloWorld </servlet-class> //完整的包名+类名
</servlet>
<!-- 配置如何访问这个servlet -->
<servlet-mapping>
<servlet-name> FirstServlet </servlet-name> //和上面那个起的别名必须相同!
<url-pattern> /HelloServlet </url-pattern> //访问Servlet的URL
</servlet-mapping>
</web-app>
根据上面配置的web.xml那么项目的访问路径为:
七、继承类创建servlet:
定义HelloWorld类继承HttpServlet类:
1、实现doGet
或doPost
方法(或两者都实现)。
2、这两个方法的方法参数均为:
- HttpServletRequest: 用于获取Form表单的数据、HTTP请求头部信息等等。
- HttpServletResponse: 用于设置HTTP状态代码、HTTP响应头部信息、获取用于向客户端发送数据的输出流对象。
3、多数情况下在doPost
方法中调用 doGet
, 或相反。
八、servlet请求与响应:
1、Get与Post提交的区别:
2、何时使用GET/POST方法:
- 请求一个静态页面或图形文件时使用GET方法,因为仅仅需要发送文件名;
- 发送大数据的时候,使用POST方法;
- 上传文件时,使用POST方法;
- 发送用户名、密码或其他保密信息的时候使用POST方法 。
3、响应状态头:
setHeader() 设置响应头,String类型的值
addHeader() 加响应头
setIntHeader()设置响应头,int类型的值
setDateHeader()设置响应头,date类型的值
containsHeader()是否包含指定的响应头
addCookie()向set-cookie报头插入一个cookie
4、设置处理乱码的方法:
setContentType() 设置响应的类型和编码方式,比如response.setContentType("text/html;charset=utf-8");
setCharacterEncoding() 设置响应字符编码,比如response.setCharacterEncoding("utf-8");
5、响应消息体:
getWriter( ) 方法用于得到一个文本输出流
PrintWriter out = response.getWriter();
调用print()、println()或write()方法
getOutputStream( ) 方法用于得到一个二进制输出流
ServletOutputStream out = response.getOutputStream();
OutputStream比使用PrinterWriter发送文本效率更高,可以动态地创建任何形式的数字内容
例:
public void doGet( HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
....
}
public void doPost( HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
6、HttpServletRequest对象方法:
获取请求行:
getMethod():获取HTTP的请求方法,GET、POST等
getRequestURI():获取请求的URI,如 /项目名/servlet路径
getRequestURL():获取请求的URL,包含协议名、服务器名或IP、端口号和请求资源但不包括查询字符串参数,如http://127.0.0.1:8080/lovo/index.html
getQueryString():获取请求URL后面的查询字符串,如name=zhangsan
getProtocol():获取请求的协议名和版本号,如HTTP/1.1
getContextPath():获取项目名称
getServletPath():获取Servlet的映射路径,如Analyz
获取请求头:
getHeader(name):返回指定的请求头的值
getHeaders(name):返回一个Enumeration(枚举)包含请求头中的所有值
getHeaderNames():特定请求中接收到的所有请求头的名称
getIntHeader(name):获取特定请求头的值,并将其转化为int类型
getDateHeader(name):获取特定请求头的值,并将其转化为Date类型
7、获取表单数据:
getParameter(parameterName)
:获取表单参数的值,参数名区分大小写,与HTML表单中出现的参数名一致,GET请求还是POST请求都可以采用相同的方式getParameterValues(parameterName)
:获取同一个参数名的多个参数值,返回字符串数组对象getParameterNames(
):以Enumeration (枚举)的方式返回请求中所有的表单参数名列表
例:
String name=request.getParameter("username");
String sex=request.getParameter("sex");
String email=request.getParameter("email");
8、请求重定向:
- 当Web服务器接受到客户端的请求后,由于某些条件限制,不能访问当前请求URL所指向的Web资源,可以指定了一个新的资源路径,让客户端重新发送请求,这就是请求重定向。
实现重定向的两种方式:
1、状态码302+location配合使用:
response.setStatus(302);
response.setHeader(“location”,“/项目名/页面名或servlet名”)
2、直接指定URI跳转:
response.sendRedirect("/lovobook/bar.html");
9、设置页面自动刷新:
1、定时跳转:从一个页面定时跳到另一个页面,比如注册页面跳转到登录页面
response.setHeader("Refresh", "5;URL=http://www.baidu.com");
2、定时刷新:页面地址不变,页面数据变化,比如网络购票
response.setHeader("Refresh", "3");
response.getWriter().println(new java.util.Date());
10、响应状态头:
例:
输出Excel表
public class RefreshServlet extends HttpServlet
{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setCharacterEncoding("GBK");
//设置响应类型(Excel)
response.setContentType("application/vnd.ms-excel");
PrintWriter out = response.getWriter();
out.println("姓名\t 年龄\t 性别");
out.println(“张小三\t 20\t 男");
out.println(“李小斯\t 21\t 女");
}
}
结果会产生一个Excel文件
九、ServletContext对象:
作用:在ServletContext中可以存放能够被所有用户访问的共享数据。
特点:
- 只在web应用被关闭的时候才被销毁
- 不同的web应用,ServletContext各自独立存在
- 每个Web应用只有一个ServletContext对象
获取对象:getServletContext()
- 同一Web应用中不同Servlet调用getServletContext 方法获得的是同一个ServletContext对象实例
可以对其进行锁定,用以防止web应用程序对关键部分的访问。
ServletContext的常用方法:
访问初始参数的方法:
getInitParameter(String name), getInitParameterNames()
读取web应用属性的方法:
getAttribute(String name), getAttributeNames( )
操纵web应用属性的方法:
setAttribute(String, Object), removeAttribute(String)
获取资源转发器:
RequestDispatcher getRequestDispatcher(String path)
十、RequestDispatcher对象:
作用:将客户发送的请求发送给服务器的其他资源。
资源类型可以是静态资源(如HTML文件)也可以动态资源(如 Servlet 或JSP 文件) 。
例:
要将请求发送给资源x
//必须使用相对于根”/”的路径
getServletContext().getRequestDispatcher("/x")
//可以为当前或根的相对路径
request.getRequestDispatcher("x")
RequestDispatcher的方法:
将请求从当前的Servlet转发到其他资源 :
void forward(ServletRequest request,ServletResponse response)
在响应对象中包含资源的内容:
void include(ServletRequest request,ServletResponse response)
例:转发到index.html
getServletContext().getRequestDispatcher("/index.html").forward(request, response);
ok,这次就先到这里吧,后面会话的Cookie和Session单独再记录一篇。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下