4 Servlet

4 Servlet

  • servlet步骤
  • Request
    • Request对象传递数据
    • RequestDispatcher接口
  • Response
    • 发生状态码的方法
    • 发送响应头相关的方法
    • 发送响应消息体相关的方法
    • 文件下载
  • 会话
    • Cookie
    • Session
  • Servlet三个作用域总结
  • Servlet生命周期
  • servlet配置
  • ServletContext
  • ServletConfig
  • 初始化参数
  • 扩展

servlet步骤

  1. 创建类,继承自HttpServlet,重写doGet和doPost方法
package helloServlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class helloServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    System.out.println("get请求执行");
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    System.out.println("post请求执行");
  }

}
  1. 编写配置文件

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>helloServletdisplay-name>
  
 <servlet>
  <servlet-name>helloServletservlet-name>
  <servlet-class>helloServlet.helloServletservlet-class>	
servlet>
<servlet-mapping>
  <servlet-name>helloServletservlet-name>
  <url-pattern>/hellourl-pattern>
servlet-mapping>


<welcome-file-list>
    <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.htmwelcome-file>
    <welcome-file>index.jspwelcome-file>
    <welcome-file>default.htmlwelcome-file>
    <welcome-file>default.htmwelcome-file>
    <welcome-file>default.jspwelcome-file>
  welcome-file-list>
web-app>
  1. 浏览器访问路径
    localohost:8080/helloServlet/hello
  • servlet执行流程
    • 浏览器访问url获取url-pattern
    • 到web.xml中匹配获取的url-pattern,然后获取相关的类及其路径
    • 调用类进行业务处理

Request

  • 获取请求行信息相关方法
方法 描述
String getMethod() get、post
String getReuestURI() 获取主机请求行中的资源部分
String getQueryString() 获取请求行中的参数部分
String getProtocol() 获取协议及其版本
String getContextPath() 获取请求URL中属于web应用程序的路径,如果请求属于web站点的根目录,返回结果为空字符串
String getServletPath() 获取servlet名称或所映射的路径
String getRemoteAddr() 获取请求客户端的IP地址
String getRemoteHost() 获取客户端连接的端口
String getLocalName() 获取web服务器当前连接网络对应的主机名
int getLocalPort() 获取服务器接收网络连接的端口号
String getServerName() 获取当前请求所指向的主机名,jiHTTP请求消息post字段对应的主机名部分
int getServerPort() post字段对应的端口号
String getScheme() 获取请求的协议名
StringBuffer getRequestURL() 获取请求的完整url
  • 请求头相关方法
方法 描述
String getHeader(String name) 获取指定字段的值
Enumeration getHeaders(String name) 获取指定字段的值
Enumeration getHeaderNames() 获取所有字段的值
int getIntHeader(String name) 获取特定字段的值并将其转换为int型
Long getDateHeader(String name) 获取指定字段的值并将按GMT时间格式其转换为毫秒时间值
String getContentType() 获取Content-Type
int getCntentLength() 获取content-length
String getCharacterEncoding() 获取字符集编码
  • 获取请求参数
方法 描述
String getParameter(String name) 获取指定参数的值,没有返回null,有则获取第一个
String[] getParamterValue(String name) 获取指定参数的所有值
Map getParamterMap() 获取所有的请求参数,key为参数名,value为对应的所有值
Enumeration getParameterNames() 获取所有参数

Request对象传递数据

  • setAttribute(String name,object o)
  • getAttribute(String name)
  • removeAttribute(String name)
  • getAttributeNames()

RequestDispatcher接口

  • web收到客户端请求时,告知另一个资源去处理请求
  • ServletRequest中定义的获取RequestDispatch对象的方法
    getRequestDispatch(String path):path必须以‘/’开头
  • 通知其他web资源处理当前servlet请求
    //传递当前请求,必须在客户端响应之前被调用,即请求转发
    forward(ServletRequest request,ServletResponse response)
    //将其他资源作为当前响应内容包含进来
    include(ServletRequest request,ServletResponse response)
    

Response

发生状态码的方法

方法 描述
setStatus(int status) 设置http响应消息状态码
sendError(int sc) 发送表示错误信息的状态码
sendError(int sc,String message ) 发送错误信息状态码的同时发送说明说明信息

发送响应头相关的方法

方法 描述
void addHeader(String name,String value) 设置响应头字段,可以增加同名的响应头字段
void setHeader(String name,String value) 设置响应头字段,会覆盖同名的响应头字
void addIntHeader(String name,int value) 设置包含整数的响应头
void setIntHeader(String name,int value) 设置包含整数的响应头
void setContentLength(int len)
void setContentType(String type)
void setLocale(Locale loc) 设置本地化信息
void setCharacterEncoding(String charse)

发送响应消息体相关的方法

方法 描述
getOutputStream() 获取ServletOutputStream字节输出流
getWriter() 获取PrintWriter字符输出流对象
String b = "hello";
OutputStream ou = resp.getOutputStream();
ou.write(b.getBytes());

getOutputStream与getWriter互相排斥,不可以同时使用
原因:

  • 调用response.getWriter()之前就已经调用了response.getOutputStream

文件下载

  • 不仅需要指定文件单独路径,还要在http协议中设置两个响应头

    //设定接收程序处理数据的方式
    Content-Disposition:attachment;filename=
    //设定实体内容的MIME类型
    Content-Type:application/x-msdownload
    
    //接收参数
    String filename = request.getParamter("filename");
    //设置content-type头
    String type = this.getServletContext().getMimeType(filename);
    response.setHeader("Content-type",type);
    //设置content-Disposition
    response.setHeader("Content-Disposition","attachment;filename="+filename);
    //设置文件的InputStream
    String realPath = this.getServletContext().getRealPath("/download/"+filename);
    InputStream in = new FileInputStream(realPath);
    //获取response输出流
    OutputStream out = response.getOutputStream();
    int len = 0;
    byte[] b = new byte[1024];
    while((len=in.read(b))!=-1){
      os.write(b,0,len);
    }
    in.close();
    
  • 中文文件

    String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
    ...
    
  • 中文乱码解决

    1. 第一种方式
    //设置HttpServletResponse使用utf-8
    response.setCharacterEncoding("utf-8");
    //通知服务器使用指定编码
    response.setHeader("Content-Type","text/html;charset=utf-8");
    
    1. 第二种方式
    response.setContentType("text/html;charset=utf-8");
    

会话

  • Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie
  • Session:将数据存储到服务器端,安全性相对好,增加服务器的压力

Cookie

  • 服务器端发送一个cookie到客户端
  1. 创建cookie
    Cookie cookie - new Cookie(String cookieName,String cookieValue);
  • 不能存储中文
  1. 将cookie发送给浏览器
    HttpServletResponse.addCookie(Cookie cookie)
  2. 接收浏览器携带的所有cookie
    HttpServletRequest.getCookies()
  • cookie分类

    • 会话级别的Cookie:默认,关闭浏览器就销毁了
    • 持久级别的Cookie:需要设置有效时长
      • setMaxAge(int expiry):以秒为单位,超过指定时间自动销毁
      • setMaxAge(0):手动销毁
      • setPath(String uri):设置cookie的有效路径
        • 如果不设置携带路径,那么该cookie信息会在访问产生该cookie的 web资源所在的路径都携带cookie信息
        • cookie.setPath("/WEB16");
          代表访问WEB16应用中的任何资源都携带cookie
          cookie.setPath("/WEB16/cookieServlet");
          代表访问WEB16中的cookieServlet时才携带cookie信息
  • cookie唯一表示

    • 唯一表示:domain+path+name
    • 如:/web/a/b/c/CookieName
  • Cookie 的API总结

方法 描述
getName() 获取cookie的名称
getValue() 获取cookie的值
setMaxAge(int expiry) 设置有效时间
setPath(String url) 设置的路径以及子路径都允许访问cookie

Session

  • 将数据保存在ServletContext中,多个用户共享一份数据
  • 将数据保存在request中,多次请求不能共享数据
  • 有了cookie为什么还要session
    • cookie有大小和个数限制,session存到服务器,没有大小和个数限制
  • HttServletRequest获取session
    • HttpSession getSession(boolean create):判断是否创建新的session对象
      • session对象不存在时,创建并返回新的HttpSession对象
      • 存在时返回null
    • HttpSession getSession():总是创建新的session对象
  • session方法
方法 描述
String getId() 获取与session对象关联的会话标志号
Long getCreationTime() 获取session创建的时间,毫秒表示
long getLastAccessedTime() 返回客户端最后一次发送Session相关请求时间,毫秒表示
void setMaxInactiveInterval(int interval) 设置session可空闲的最长时间,以秒为单位
boolean isNew() 判断当前session是否新创建
void invalidate() 强制session无效
ServletContext getServletContext() 获取servletContext对象
void setAttribute(String name,obect value) 设置属性
String getAttribute(String name) 获取属性
void removeAttribute(String name) 移除属性

Servlet三个作用域总结

  • ServletContext

    • 一个web应用只有一个,保存的数据在整个web内共享
    • 服务器启动时创建、关闭时销毁
  • HttpSession

    • 针对一次会话
    • 销毁
      • 非正常关闭服务器(正常关闭时,session被序列化)
      • session过期。默认30分钟(从不操作服务器资源开始计时)
      //web.xml中配置
      <session-config>
          <session-timeout>30</session-timeout>
      </session-config>
      
      • 手动调用invalidate方法强制销毁
  • HttpServletRequest

    • 针对一次请求,使用该对象保存数据
  • API相同

    • setAttribute()
    • getAttribute()
    • removeAttribute()

Servlet生命周期

  1. 第一次调用时,执行初始化方法init(ServletConfig)
  2. 第一次调用,都将执行service(ServletRequest,ServletResponse)方法
  3. 服务器关闭或者项目移除destroy()
  • Servlet生命周期
    创建:用户第一次访问时创建servlet实例(单实例)
    销毁:项目从服务器移除或者关闭服务器时

servlet配置

  • 启动时创建Servlet
    • 标签中配置
      num:num为正整数,值越小,被创建的优先级越高
  • url-pattern(优先级递减)
    • 完全路径匹配:以 / 开头
    • 目录匹配:以/开始,需要以 * 结束
    • 扩展名匹配:不能以/开始以,需要 * 开始的,如*.jsp
    • 缺省路径:/
  • 开发中路径的编写
    • 相对路径:不能以/开始
      ./ 当前路径 ../上一级目录
    • 绝对路径
      • 客户端路径:/工程名/url
      • 服务器端路径:/url

ServletContext

  • 服务器启动时,为每个web应用创建一个单独的ServletContext对象,可以在多个servlet对象之间共享数据
方法 描述
void setAttribute(String name, Object object ) 向ServletContext存放数据
Object getAttribute(String name) 获取ServletContext中特定名称的数据
void removeAttribute(String name) 移除ServetContext中的某个数据
Enumeration getAttributeNames() 获取所有属性
  • 读取资源文件
方法 描述
Set getResourcePaths(String path) 集合内包含资源目录下的子目录和文件路径名称,path必须以/开头
String getRealPath(String path 返回资源文件在服务器文件系统中的绝对路径,path必须以/开头(表示当前web应用的根目录),如果不能将资源文件转换为真实路径,,则返回null
URL getResource(String path) 返回映射到资源文件的URL对象
InputStream getResourceAsStream(String path) 返回映射到某个资源文件的InputStream输入流对象
ServletContext context = this.getServletContext();
InputStream in = context.getResourceAsStream("/web-inf/classed/xxx.properties");
String path = context.getRealPath("/web-inf/classed/xxx.properties");
...
Properties  pros = new Properties();
pros.load(in);
...

ServletConfig

方法 描述
String getInitParmater(String name) 获取初始化参数
Enumeration getInitParamterNames() 获取所有的初始化参数
ServletContext getServletContext() 获取ServletContex对象
String getServletName() 获取所有servlet的初始化参数单独名称

初始化参数

  1. web.xml下配置全局初始化参数
//全局初始化参数
<context-param>
  <param-name>name</param-name>
  <param-value>value</param-value>
</context-param>

//servlet初始化参数
<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>helloServlet.helloServlet</servlet-class>
    <!-- 初始化参数  -->
    <init-param>
  	<param-name></param-name>
  	<param-value></param-value>
    </init-param>	
</servlet> 

扩展

  • 类加载器读取文件
className.class.getClassLoader().getResourcAsStream("文件名")

你可能感兴趣的:(JavaWeb)