Servlet


  1. tomcat下载地址

    bin:包含启动和终止Tomcat服务器的脚本,如:startup.bat、shutdown.bat;
    lib:包含服务器和Web应用程序使用的类库,如:servlet-api.jar、jsp-api.jar;
    webapps:Web应用的发布目录,服务器可对此目录下的应用程序自动加载;


  1. Servlet API

    javax.servlet 包 \
    javax.servlet.http 包

接口:                     实现类:

    Servlet                 GenencServlet
    ServletConfig
    ServletRequest
    ServletResponse
    HttpServletRequest      HttpServlet 
    HttpServletResponse

所有 Servlet 都必须直接或间接地实现 javax.servlet.Servlet 接口;
Servlet 接口规定了必须由 Servlet 类实现并且由 Servlet 引擎识别和管理的方法集;
Servlet 接口的基本目标是提供与 Servlet 生命周期相关的方法
- init()
- service()
- destroy()

Servlet 接口

初始化方法,任何 Servlet 实例init()方法只能调用一次;
void init(ServletConfig config);    

服务方法,对 Servlet 发出请求时调用该方法处理用户请求,
ServletRequest 参数提供访问请求数据的方法和字段, 
ServletResponse 参数提供 Servlet 构造响应的方法; 
void service(ServletRequest req, ServletResponse res);

获得 ServletConfig 对象;                                
ServletConfig getServletConfig();   

返回 String 对象,包含 Servlet 信息;
String getServletInfo();        

销毁方法,容器在终止 Servlet 服务前调用此方法;当 service() 正在执行时,destroy()不被执行;
void destroy();                                         

HttpServlet 抽象类方法

GET 请求,调用 HttpServlet 的 doGet() 方法:
POST 请求,调用 HttpServlet 的 doPost() 方法;
void service(HttpServletRequest req, HttpServletResponse res);      

处理 HTTP GET 操作;                                                     
doGet(HttpServletRequest req, HttpServletResponse res);             

处理 HTTP POST 操作;    
doPost(HttpServletRequest req, HttpServletResponse res);            

  1. Servlet 声明配置

    注解 @WebServlet 的属性描述

属性名         类型      描述
name            String      指定 Servlet 名字,一般与 Servlet 类名相同;
urlPatterns     String[]    指定一组 Servlet 的 URL 匹配模式,可以是匹配地址映射,匹配目录映射,匹配扩展名映射;
value           String[]    等价于 urlPatterns 属性;(不可同时使用)
loadOnStartup   int         指定加载顺序,没有指定时,表示容器在第一次请求时才加载;
                            0 或 大于 0 时,容器在应用启动时加载这个 Servlet, 值越小,优先级越高;
initParams      WebInitParans   指定一组 Servlet 初始化参数,为可选项;
asyncSupported  boolean     声明 Servlet 是否支持异步操作模式,默认 false ;
description     String      指定该 Servlet 描述信息;
displayName     String      指定该 Servlet 显示名,配合工具使用;

  • 注解方式配置

    @WebServlet(
        name = "XXServet", urlPatterns = {"/XX"},
        initParams = { @WebInitParam(name = "username", value = "qst")},
        loadOnStartup = 0, asyncSupported = true,
        displayName = "XXServet", description = "Servlet 样例")
    public class XXServet extends HttpServlet{
        //
    }
  • web.xml中配置
web.xml

        <servlet>
            <description>Servlet 样例</description>
            <display-name>XXServet </display-name>
            <servlet-name>XXServet </servlet-name>
            <servlet-class>demo2.servlet.XXServet </servlet-class>
            <init-param>
                    <param-name>username</param-name>
                    <param-value>Lancer </param-value>
            </init-param>
            <load-on-startup>0</load-on-startup>
            <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
            <servlet-name>XXServet </servlet-name>
            <url-pattern>/XX <url-pattern>
    </servlet-mapping>

  1. HttpServletRequest 对象常用的数据处理方法:
public String getParameter(String name);        返回由name指定的用户请求参数的值;
public String[] getParameterValues(String name);返回由name指定的一组用户请求参数的值;
public Enumeration getParameterNames();         返回所有客户请求的参数名;
Servlet 数据处理总结

    客户端向服务器请求数据方式:

    超链接:属于 GET 请求类型,请求的数据在 URL 之后,以 ? 分割 URL 和传输数据,
                参数之间以 & 相连;(传送简单数据)
    Form 表单:默认使用 GET 请求类型,多使用 POST 请求类型。(一般用于更新资源信息)

  1. 重定向与请求转发
  重定向:是指由原请求地址重新定位到某个新地址;
    HttpServletResponse 对象的 sendRedirect() 方法实现;
    public void sendRedirect(String location) throw java.io.IOException
    location 参数用以指定重定向的 URL, 它可以是相对路径或绝对路径;
  请求转发:把请求转发给另外一个资源,并让该资源对此请求进行响应;
    RequestDispatcher 接口中的 forward() 方法来实现,该方法可以
    RequestDispatcher 接口有以下两个方法:
        forward() 方法:将请求转发给其他资源;
        include() 方法:将其他资源并入到当前请求中;
// path 只能是相对地址
RequestDispatcher dispatcher = request.getRequestDispatcher(String path);   
dispatcher.forward(ServletRequest request, ServletResponse response);

  1. Servlet 核心接口

    ServletConfig 接口:用于获取 Servlet 初始化参数和 ServletContext 对象;

    ServletContext 接口:代表当前 Servlet 运行环境,Servlet 可以通过 ServletContext 对象来访问 Servlet 容器中各种资源;

    HttpServletRequest 接口:用于封装 HTTP 请求信息;

    HttpServletResponse 接口:用于封装 HTTP 响应消息;

    1.ServletConfig 接口

    public abstract interface javax.servlet.ServletConfig{}
    
    容器在初始化一个 Servlet 时,将为该 Servlet 创建一个唯一的 ServletConfig 对象,并将
    ServletConfig 对象通过 init(ServletConfig config) 方法传递并保存在 Servlet 对象中。
    

主要方法:

getInitParameter(String param)          根据给定的初始化参数名称,返回匹配的初始化参数值;
getInitParameterNames(String param)     返回一个 Enumeration 对象,里面包含了所有的初始化参数;
getServletContext();                    返回一个 ServletContext() 对象;
getServletName();                       返回当前 Servlet 的名字,即 @WebServlet 的name 属性值。如果没有配置这个属性,则返回 Servlet 类的全限定名
2.ServletContext 接口

    public abstract interface javax.servlet.ServletContext{}

    ServletContext 也称为 Servlet 上下文,代表当前 Servlet 运行环境,是 Servet 与 Servlet 容器之间直接通信的接口;
    Servlet 容器在启动一个 Web 应用时,会为该应用创建一个唯一的 ServletContext 对象供该应用中的
    所有 Servlet 对象共享, Servlet 对象可以通过 ServletContext 对象来访问容器中的各种资源;

    获得 ServletContext 对象的两种方式:
        ServletConfig 接口的 getServletContext() 方法;
        GenericServlet 抽象类的 getServletContext() 方法;

    方法:
    1.获取应用范围的初始化参数的方法
        getInitParameter(String name)       返回 Web应用范围匹配的初始化参数,
                                                在 web.xml 中<web-app>元素中
                                            <context-param>元素表示范围内的初始化参数
        getInitParameterNames()         返回一个包含初始化参数的 Enumeration 对象;

    2.获取应用范围域属性的方法
        setAttribute(String name, Object object)        把一个对象和一个属性名绑定并存放在 ServletContext 中,
                                                    参数 name 指定属性名,参数 object 表示共享数据;
        getAttribute(String name)               根据参数给定的属性名,返回一个 Object 类型对象;
        getAttributeNames()                     返回一个 Enumeration 对象,该对象包含了所有存放在ServletContext 中的属性名;

        removeAttribute(String name)            根据参数指定的属性名,从 ServletContext 对象中删除匹配的属性;

    3.获取当前 Web 应用信息的方法
        getContextPath()                返回当前 Web 应用的根路径;
        getServletContextName()             返回当前 Web 应用的名字,即<web-app>元素中<display-name>元素的值;
        getRequestDispatcher(String path)           返回一个用于向其它 Web 组件转发请求的 RequestDispatcher 对象;
        getContext(String urlpath)          根据参数指定的 URL 返回当前 Servlet 容器中其他 Web 应用的
                                            ServletContext() 对象,URL 必须是以"/"开头的绝对路径;
    4.获取当前容器信息和输出日志的方法
        getServletInfo()                返回 Web 容器的名字和版本;
        getMajorVersion()               返回 Web 容器支持的 Servlet API 的主版本号;
        getMinorVersion()               返回 Web 容器支持的 Servlet API 的次版本号;
        log(String msg)                 用于记录一般的日志;
        log(String message, Throwable throw)            用于记录异常的堆栈日志;

    5.获取服务器端文件资源的方法;
        getResourseAsStream(String path)    返回一个读取参数指定的文件的输入流,参数路径必须以"/"开头;
        getResourse(String path)            返回由 path 指定的资源路径对应的一个 URL 对象;("/")
        getRealPath(String path)            根据参数指定的虚拟路径,返回文件系统中的一个真实的路径;
        getMimeType(String file)            返回参数指定的文件的 MIME 类型;


3.HttpServletRequest 接口

    public interface HttpServletRequest extends ServletRequest{}

    ServletRequest 用于封装请求信息,ServletRequest 对象由 Servlet 容器在用户每次请求 Servlet 时创建
    并传入 Servlet 的 service()方法中;

    HttpServletRequest 是专用于 HTTP 协议的子接口,用于封装 HTTP 请求信息;

    HttpServletRequest 接口方法: 
        1.获取请求报文信息(包括请求行,请求头,请求正文)的方法;
            1.请求行:由请求方法,请求 URL 和请求协议及版本组成;
                例:(GET/chapter03/RequsetLineServlet?pageNo=2&queryString=QST HTTP/1.1)

                getMehtod()         获取请求使用的 HTTP 方法,GET,POST,PUT
                getRequestURI()     获取请求行中的资源名部分
                getProtocol()       获取使用的协议及版本号,HTTP/1.1
                getQueryString()    获取请求 URL 后面的查询字符串,只对 GET 有效
                getServletPath()    获取 Servlet 所映射的路径;
                getContextPath()    获取请求资源所属于的 Web 应用的路径

            2.请求头

                public abstract Enumeration getHeaderNames();
                public abstract String getHeader(String headerName);

                getIntHeader(String name)       获取整数类型参数名为 name 的 http 头部
                getDateHeader(String name)      获取 long 类型 name 的 http 头部
                getContentLength()          获取请求内容的长度,以字节为单位
                getContentType()            获取请求的文档类型定义
                getLocale()             获取用户浏览器设置的 Locale 信息;

            3.请求正文
                HTTP 协议请求正文内容为 POST 请求参数名称和值所组成的一个字符串;
                HTTP 协议的 POST 请求,主要通过 Form 表单向 Web 服务器端程序提交数据请求的方式实现;

                <form>表单元素的 enctype 属性用于指定浏览器使用哪种编码方式
                    application/x-www-form-urlencoded   (默认)
                    multipart/form-data                 (上传文件)

                String getParameter(String name)        返回由 name 指定的用户请求参数的值
                Enumeration getParameterNames()     返回所有客户请求的参数名;
                String[] getParameterValues(String name)    返回由 name 指定的用户请求参数的值;
                Map getParameterMap()           返回一个请求参数的 Map, Map 中的键为参数的名称,值为参数名对应的参数值;                           

                <form action = "服务器端程序地址" method = "post" enctype = "multipart/form-data">
                        <input name="文件名称" type="file">
                        <input type="submit" value="提交">
                </form>

                ServletInputStream getInputStream()     获取上传文件二进制输入流
                BufferedReader getReader()              获取上传文件字符缓冲输入流

                使用 @MultipartConfig 注解方式获取上传文件

            4.中文乱码
                在调用 HttpServletRequest 对象的 getParameter() 方法前先调用 
                setCharacterEncoding(charset)方法设定与请求编码相同的解码字符集;


                request.setCharacterEncoding("UTF-8");


        2.获取网络连接信息的方法;

            getRemoteAddr()         获取请求用户的 IP 地址;
            getRemoteHost()         获取请求用户的主机名称;
            getRemotePort()         获取请求用户的主机所使用的网络端口号;
            getLocalAddr()          获取 Web 服务器的 IP 地址
            getLocalName()          获取 Web 服务器所使用的主机名
            getLocalPort()          获取 Web 服务器所使用的网络端口号
            getServerName()         获取网站的域名
            getServerPort()         获取 URL 请求的端口号
            getScheme()         获取请求使用的协议,http或是https
            getRequestURL()         获取请求的 URL 地址


        3.存取请求域属性的方法;

            请求域属性:存储在 HttpServletRequest 对象中的对象,属于同一个请求的多个处理组件之间
                  可以通过请求域属性来传递对象数据;

            void setAttribute(String name, Object value)    存入一个请求域属性,name 为属性名,value 为属性值;
            Object getAttribute(String name)            根据属性名称取出一个请求域属性值;
            void removeAttribute(String name)       根据属性名称从请求范围内移除一个请求域属性;
            Enumeration getAttributeNames()         获取所有请求范围内的请求域属性对象;


4.HttpServletResponse 接口

    public interface HttpServletResponse extends ServletResponse{}

    ServletResponse 用于创建响应信息,ServletRequest 对象由 Servlet 容器在用户每次请求 Servlet 时创建
    并传入 Servlet 的 service()方法中;

    HttpServletRequest 是专用于 HTTP 协议的子接口,用于封装 HTTP 响应信息;



    1.设置响应状态的方法

        setStatus(int sc)       以指定的状态码将响应返回给客户端
        setError(int sc)            使用指定的状态码向客户端返回一个错误响应
        sendError(int sc, String msg)   使用指定的状态码和状态描述向客户端返回一个错误响应
        sendRedirect(String location)   请求的重定向,会设定响应 Location 报头以及改变状态码

        响应状态码:
                          200 请求成功
                      302 资源(网页等)暂时转移到其它 URL
                  404 请求资源不存在
                      500 服务器内部错误

    2.构建响应头的方法

        设置值是 String 类型的响应消息头
            public abstract void setHeader(String headerName, String headerValue)

        含有整数和日期的消息头
            public abstract void setIntHeader(String headerName, int headerValue)
            public abstract void setDateHeader(String headerName, long millisecs)

        setContentType(String mime)     设定 Content-Type 消息头
        setContentLength(int length)        设定 Content-Length 消息头
        addHeader(String name, String value)    新增 String 类型的值到名为 name 的 http 头部
        addIntHeader(String name, int value)    新增 int 类型的值到名为 name 的 http 头部
        addDateHeader(String name, long data)   新增 long 类型的值到名为 name 的 http 头部
        addCookies(Cookie c)            为 Set-Cookie 消息头增加一个值


    3.创建响应正文的方法

        通过输出流对象来完成

        getOutputStream()       返回字节输出流对象 ServletOutputStream (二进制数据)
        getWriter()         返回字符输出流对象 PrintWriter          (字符串)

    4.响应输出中文问题

        response.setCharacterEncoding("UTF-8");         //优先权最高
        response.setContentType("text/html;charset=UTF-8"); //编码方式,解码方式
        response.setLocale(new java.util.Locale("zh", "CN"));

  1. 会话跟踪技术

    1.Cookie 技术
    javax.servlet.http.Cookie 类

    例:Cookie unameCookie = new Cookie("username", "QST");       //两个参数指定 Cookie 属性名,属性值
    
    Cookie 对象响应
        response.addCookie(unameCookie);
    
    获取并遍历客户端 Cookie
        Cookie[] cookies = request.getCookies();
        if(cookies != null)
            for(Cookie c : cookies){
                out.println("属性名:" + c.getName());
                out.println("属性值:" + c.getValue());
            }
    
    Cookie 的访问路径
        unameCookie.setPath("/chapter04/jsp/");     设置 Cookie 在某个应用下的访问路径
        unameCookie.setPath("/");           设置 Cookie 在服务器下所有应用的访问路径
    
    Cookie 存活时间的设置
        unameCookie.setMaxAge(7*24*60*60);
        时间为正整数,表示其存活的秒数;
        时间为负数,表示其为临时 Cookie;
        时间若为 0,表示通知浏览器删除相应的 Cookie;
    

    2.Session 技术
    javax.servlet.http.HttpSession 接口

    服务器创建会话对象时,会为其分配一个唯一的会话标识---SessionId,以"JSESIONID"的属性名保存在客户端
    Cookie 中,来识别不同用户,实现对每个用户的会话跟踪;
    
    获取 HttpSession 对象
        HttpServletRequest 接口
    
        getSession()            获取与客户端请求关联的当前有效的 Session,若没有 Session 关联则新建一个;
        getSession(boolean create)  获取与客户端请求关联的当前有效的 Session,
                                        若没有 Session 关联,当参数为真时,Session 被创建,为假时,返回空值
    
    
        例:HttpSession session = request.getSession();
            HttpSession session = request.getSession(true);
    
    HttpSession 接口的方法
    
        void setAttribute(String key, Object value) 以 key/value 的形式将对象保存在 HttpSession 对象中
        Object getAttribute(String key)         通过 key 获取对象值
        void removeAttribute(String key)            从 HttpSession 对象中删除指定名称 key 所对应的对象
        void invalidate()               设置 HttpSession 对象失效;
        void setMaxInactiveInterval(int interval)   设定 HttpSession 对象的非活动时间(秒),若超时,失效
        int getMaxInactiveInterval()
        String getId()                  获取 HttpSession 对象标识 sessionid
        long getCreationTime()                  获取 HttpSession 对象产生的时间
        long getLastAccessedTime()          获取用户最后通过这个 HttpSession 对象送出请求的时间
    
    
        设置最大不活动时间
            <session-config>
                    <!--单位为分钟-->
                    <session-timeout>10</session-timeout>
            </session-config>
    
            session.setMaxInactiveInterval(600);
    

    3.URL 重写技术

    在 URL 地址后追加会话标识 jsessionid
    
    URL 重写实现方法
        HttpServletResponse 的方法
    
        encodeURL()         可以对任意请求的 URL 进行重写
        encodeRedirectURL() 主要使用 sendRedirect() 方法的 URL 重写;
    
        例:out.print("<a href='" + response.encodeURL("EncodeURLServlet") + "'>链接请求</a>");
            response.sendRedirect(response.encodeRedirectURL("EncodeURLServlet"));
    

    4.隐藏表单域技术

    <form action="xx" method="post">
            <input type="hidden" name="userID" value="10010">
            <input type="submit" value="提交">
    </form>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值