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、实现doGetdoPost方法(或两者都实现)。

2、这两个方法的方法参数均为:

  • HttpServletRequest: 用于获取Form表单的数据、HTTP请求头部信息等等。
  • HttpServletResponse: 用于设置HTTP状态代码、HTTP响应头部信息、获取用于向客户端发送数据的输出流对象。

3、多数情况下在doPost方法中调用 doGet, 或相反。

八、servlet请求与响应:

1、Get与Post提交的区别
在这里插入图片描述

2、何时使用GET/POST方法

  1. 请求一个静态页面或图形文件时使用GET方法,因为仅仅需要发送文件名;
  2. 发送大数据的时候,使用POST方法;
  3. 上传文件时,使用POST方法;
  4. 发送用户名、密码或其他保密信息的时候使用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中可以存放能够被所有用户访问的共享数据。
特点:

  1. 只在web应用被关闭的时候才被销毁
  2. 不同的web应用,ServletContext各自独立存在
  3. 每个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单独再记录一篇。

猜你喜欢

转载自blog.csdn.net/qq_43531669/article/details/105569412