美文网首页
#前端 Servlet

#前端 Servlet

作者: NeyoShinado | 来源:发表于2021-10-09 15:49 被阅读0次

    1.Java Web程序开发基于Servlet编程,编码到部署有四个步骤:
    ①编写Servlet;
    ②打包war文件;
    ③复制Tomcat到webapps目录;
    ④启动Tomcat;
    2.Web工程一般分为src和webRoot两个目录,src放源码,webRoot放jsp、img及编译文件,实现显示层和代码层的分离。
    webRoot下有META-INF和WEB-INF,META-INF。META-INF存放版本号、依赖包;WEB-INF为安全目录,只能通过服务端访问,客户端无法访问。在客户端要通过web.xml映射才能访问WEB-INF的文件。安全目录实现拦截器接受命令、控制转发请求,能降低网页注入风险。

    一、简介
    ——————————————————————————
    1.简介
    Servlet 相当于MVC架构中的C(Controller),负责逻辑处理;而JSP相当于MVC架构中的V(View),负责表示层处理。Servlet 程序运行在web或应用服务器上,是HTTP服务器和数据库/应用之间的中间层,有权限访问Java API和数据库JDBC API。 Servlet 可用于收集网页表单的用户输入,呈现数据库的记录以及动态创建页面。


    image.png

    2.优势
    ①在web服务器地址空间内自行,无需创建进程来处理客户端请求;
    ②独立于平台,可用Java类库的全部功能;
    ③可通过sockets、RMI机制与applets、数据库或其他软件交互;
    3.Servlet 任务
    ①读取客户端浏览器发送的显示数据(网页的HTML表单);
    ②读取客户端浏览器发送的隐式HTTP请求数据(cookies、媒体类型、压缩格式);
    ③处理数据并生成结果(可能包括数据库访问、RMI或CORBA调用、Web服务调用或直接计算);
    ④发送显示数据到浏览器(HTML、XML、Excel等);
    ⑤发送隐式HTTP响应到客户端(文档类型、cookies和缓存参数);
    4.Servlet 包
    Java Servlet 可以使用javax.servlet和javax.servlet.http包创建,是运行在有Java Servlet 规范解释器web服务器上的Java类。

    二、环境设置
    ——————————————————————————
    1.配置JDK
    2.设置Web应用服务器:Tomcat
    Apache Tomcat是基于Java Servlet 和JavaServer Pages技术的软件实现,可作为测试Servlet 的独立服务器

    三、生命周期
    ——————————————————————————
    1.Servlet 生命周期
    ①初始化后调用init();
    ②调用service()处理客户端请求;
    ③Servlet 销毁前调用destroy()方法;
    ④Servlet 最后由JVM进行GC回收;
    2.init()
    public void init() throws ServletException {
    // 初始化代码...
    }
    只在Servlet 初始化时被调用一次,
    3.service()
    public void service(ServletRequest request,
    ServletResponse response)
    throws ServletException, IOException{
    }
    执行任务的主要方法,用于处理客户端的请求,并返回格式化响应。每接收一个Servlet 请求,Servlet 容器(Web服务器)就产生一个线程调用service(),检查HTTP请求类型(GET、POST、PUT、DELETE等)并对应地调用doGet、doPost、doPut、doDelete等方法。
    service()方法由Servlet 容器调用,只需重写doGet()或doPost()即可。
    4.doGet()
    public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
    }
    GET请求来自URL或HTML表单,由doGet()处理。
    5.doPost()
    public void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
    }
    POST请求来自指定了METHOD为POST的HTML表单,由doPost()处理。
    6.destroy()
    public void destroy() {
    // 终止化代码...
    }
    只在Servlet 销毁时被调用一次,负责关闭数据库连接、停止后台线程、将Cookies或点击计数器写入磁盘以及将Servlet 对象标记为垃圾回收。

    四、实例
    ——————————————————————————
    Web应用开发常编写Servlet 类扩展javax.servlet.http.HttpServlet接口来处理HTTP请求。
    1.编译Servlet
    添加JAR包进CLASSPATH后(>set classpath={libPath}或通过库管理工具加载),Servlet 的java脚本可通过javac编译器编译生成对应的class文件。 *2.部署Servlet ①类文件布置 类Servlet 程序默认位于<Tomcat-installation-dir>/webapps/ROOT下,而类文件放在<Tomcat-installation-dir>/webapps/ROOT/WEB-INF/classes中,且类要按包目录结构部署(如com.myorg.MyServlet对应/com/myorg/MyServlet.class文件); ②Tomcat配置 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/的web.xml配置文件添加条目: <web-app> <servlet> <servlet-name>{应用名(随意起)}</servlet-name>
    <servlet-class>${类名}</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>${应用名}</servlet-name>
        <url-pattern>${url后缀,如/HelloWorld}</url-pattern>
    </servlet-mapping>
    

    </web-app>

    注:Tomcat对大小写十分敏感;

    五、表单数据
    ——————————————————————————
    1.Servlet 表单数据
    浏览器可通过GET、POST方法将信息(表单数据)传递到Web服务器,再传往后台。
    2.GET
    浏览器默认通过GET向Web服务器传递信息,已编码的用户信息与页面用"?"分割:
    http://www.test.com/hello?key1=value1&key2=value2
    GET方法会在地址栏产生一个很长的字符串,不适用于传递敏感信息,且GET限制请求的字符串最多1024个字符。
    这些信息使用QUERY_STRING头传递,可通过QUERY_STRING环境变量访问。Servlet 通过doGet()处理GET请求。
    3.POST
    POST打包信息的方式与GET相同,但POST不会将信息置为URL?字符串发送,而是以标准形式传到后台。Servlet 使用doPost()处理POST请求。
    4.Servlet 读取表单数据
    ①request.getParameter()获取表单参数的值;
    ②getParameterValues()获取多次出现的参数值(复选框);
    ③getParameterNames()获取请求的所有参数列表;
    5.使用URL的GET方法实例
    URL(http://localhost:8080/HTTPResponse/UrlGetSer?name=菜鸟教程&url=www.runoob.com)想程序传递两个值name&url,使用HttpServletRequest.getParameter()能获取客户端传递的信息,然后在doGet()方法中进行处理。
    6.使用表单的GET方法实例
    HTML表单(需置于WEB-INF下)构建输入页面,再通过Servlet处理Get输入。
    HTML里的<form action="$Servlet名" method="GET">指定了Servlet程序以及调用方法(doGet())。
    7.使用表单的POST方法实例
    同上,不同点在于带有POST方法的HTML调用的是处理POST请求的doPost()方法。
    复选框数据:HTML 元素指定<input type ="checkbox">

    六、客户端HTTP请求
    ——————————————————————————
    1.浏览器请求网页时会发送特定的HTTP请求信息(头信息)
    头信息 描述
    Accept 指定浏览器处理的MIME类型,如image/png或image/jpeg;
    Accept-Charset 指定浏览器可显示信息的字符集,如ISO-8859-1;
    Accept-Encoding 指定浏览器如何处理的编码类型,如gzip或compress;
    Accept-Language 指定浏览器首选语言,如en、en-us、ru等;
    Authorization 用于识别客户身份;
    Connection 指示客户端是否能处理持久HTTP连接(能通过单个请求检索多个文件),如Keep-Alive为持续连接;
    Content-Length 给出POST数据的大小(单位字节);
    Cookie 将之前发到浏览器的Cookies返回给服务器;
    Host 指定原始URL主机及端口;
    If-Modified-Since 页面在指定日期更改时,客户端想要的页面(无则返回304);
    If-Unmodified-Since If-Modified-Since 的对面;
    Referer 包含页面跳转时前一个页面的URL;
    User-Agent 识别发出请求的浏览器,并根据不同的类型返回不同内容;
    2.HttpServletRequest对象读取HTTP头的方式:
    ①getCookies() 获取客户端请求的Cookie对象;
    ②getAttributeNames() 获取请求的可用属性名;
    ③getHeaderNames() 获取请求的所有头名;
    ④getParameterNames() 获取请求的参数名;
    ⑤getSession() 获取当前session会话,没有则创建一个;
    ⑥getLocale() 基于Accept-Language头,获取客户端接收内容的首选区域设置;
    ⑦getAttribute(String name) 返回指定命名属性的值;
    ⑧getInputStream() 以二进制形式检索请求主体;
    ⑨getAuthType() 返回保护Servlet 的身份验证方案名如BASIC或SSL;
    ⑩getCharacterEncoding() 获取请求主体使用的字符编码;
    ①①getContentType() 获取主体MIME类型;
    ①②getContextPath() 获取指示请求上下文的URI;
    ①③getHeader(String name) 获取指定请求头;
    ①④getMethod() 获取请求的HTTP方法;
    ①⑤getParameter(String name) 获取请求参数的值;
    ①⑥getPathInfo() 获取客户端发送的URL相关路径信息;
    ①⑦getProtocol() 获取协议名称和版本;
    ①⑧getQueryString() 获取路径后请求URL的查询字符;
    ①⑨getRemoteAddr() 获取客户端的IP地址;
    ②⑩getRemoteHost() 获取客户端的完全限定名称;
    ②①getRemoteUser() 若用户通过身份验证,返回发出请求的登陆用户;
    ②②getRequestURI() 从协议名到HTTP请求的第一行查询字符串中,获取URL的一部分;
    ②③getRequestedSessionId() 获取客户端指定的session会话Id;
    ②④getServletPath() 获取调用JSP请求的URL;
    ②⑤getParameterValues(String name) 获取给定请求参数的值;
    ②⑥isSecure() 指示请求是否使用安全通道如HTTPS;
    ②⑦getContentLength() 获取请求主体长度,并提供输入流;
    ②⑧getIntHeader(String name) 返回指定请求头的值为int值;
    ②⑨getServerPort() 获取接受请求的端口号;
    ③⑩getParameterMap() 将参数封装成Map;
    3.HTTP Header请求实例
    HttpServletRequest 的getHeaderNames()获取HTTP头信息,通过hasMoreElements()判断头信息是否还有参数未读取,nextElement()获取参数名称。

    七、服务端HTTP响应
    ——————————————————————————
    1.HTTP响应信息(例) :
    //状态行
    HTTP/1.1 200 OK // HTTP版本、状态码、状态码短信息
    Content-Type: text/html
    Header2: ... // 标题行、响应报头
    ...
    HeaderN: ...
    (Blank Line) // 空行
    <!doctype ...> // 消息主题:文档、查询数据或输出
    <html>
    <head>...</head>
    <body>
    ...
    </body>
    </html>
    2.HTTP1.1响应报头
    头信息 描述
    Allow 服务器支持的请求方法
    Cache-Control 响应文档的安全缓存方式
    Connection 浏览器是否使用持久HTTP连接
    Content-Disposition 请求用户以给定文件名将响应保存到磁盘
    Content-Encoding 页面编码方式
    Content-Language 文档编写使用的语言
    Content-Length 响应中的字节数
    Content-Type 响应文档的MIME类型
    Expires 内容过期时间
    Last-Modified 文档的最后修改时间
    Location 包含在带状态码的响应中,300s内通知浏览器文档的地址
    Refresh 浏览器更新页面的方式
    Retry-After 可与503响应配合使用,通知客户端如何重复请求
    Set-Cookie 指定一个与页面关联的cookie
    3.HttpServletResonse 对象响应报头的方法
    ①encodeRedirectURL(String url) 为sendRedirect方法中使用的URL进行编码;
    ②encodeURL(String url) 对含session会话ID的指定URL进行编码;
    ③containsHeader(String name) 返回是否已设置命名的响应报头;
    ④isComitted() 返回响应是否已提交;
    ⑤addCookie(Cookie cookie) 指定cookie添加到响应;
    ⑥addDateHeader(String name, long date) 添加指定名称及日期的响应报头;
    ⑦addHeader(String name, String value) 同上;
    ⑧addIntHeader(String name, int value) 同上;
    ⑨flushBuffer() 缓冲区内容写入客户端;
    ⑩reset() 清除缓冲区的数据;
    ①①resetBuffer() 清除响应中基础缓冲区的内容,不清除状态码和头;
    ①②sendError(int sc) 使用指定状态码发送错误响应到客户端,并清除缓冲区;
    ①③sendError(int sc, String msg) 同上;
    ①④sendRedirect(String location) 使用指定重定向位置URL发送临时重定向响应至客户端;
    ①⑤setBufferSize(int size) 设置响应主体首选缓冲区大小;
    ①⑥setChaacterEncoding(String charset) 设置响应的字符编码;
    ①⑦setContentType(String type) 设置响应的内容类型;
    ①⑧setContentLength(int len) 设置响应内容主体的长度;
    ①⑨setDateHeader(String name, long date) 设置响应报头名称及日期;
    ②⑩setHeader(String name, String value) 同上;
    ②①setIntHeader(String name, int value) 同上;
    ②②setLocale(Locale loc) 设置响应区域;
    ②③setStatus(int sc) 设置状态码;

    八、HTTP状态码
    ——————————————————————————
    1.Web服务器可能返回的HTTP状态码:
    代码 消息 描述
    100 | Continue | 只有部分请求被接收,但没被拒绝,客户端继续请求;
    101 | Switching Protocols | 服务器切换协议
    200 | OK | 请求成功
    201 | Created | 请求完整,并创建一个新资源
    202 | Accepted | 请求被接收处理,但处理不完整
    203 | Non-authoritative Information
    204 | No Content
    205 | Reset Content
    206 | Partial Content
    300 | Mulltiple Choices | 链接列表
    301 | Moved Permanently | 请求页面的URL已转移
    302 | Found | 请求页面的URL已临时转移
    303 | See Other | 请求的页面可在另一个URL下找到
    304 | Not Modified
    305 | Use Proxy
    306 | Unused | 该代码现已弃用,但仍被保留
    307 | Temporary Redirect | 同302
    400 | Bad Request | 服务器不理解请求
    401 | Unauthorized | 请求页面需要用户名及密码
    402 | Payment Required | 不能使用该代码
    403 | Forbidden | 禁止访问请求的页面
    404 | Not Found | 服务器无法找到请求页面
    405 | Method Not Allowed | 请求指定的方法不允许
    406 | Not Acceptable | 服务器生成一个不被客户端接受的响应
    407 | Proxy Authentication Required | 请求送达前,需要使用代理服务器验证
    408 | Request Timeout | 请求超时
    409 | Conflict | 请求因冲突无法完成
    410 | Gone | 请求页面不再可用
    411 | Length Required | "Content-Length"未定义,服务器无法处理
    412 | Precondition Failed | 请求的先决条件被服务器评为false
    413 | Request Entity Too Large | 请求实体过大,服务器不接受该请求
    414 | Request-url Too Long | URL过长,服务器不接受该请求(post转get时发生)
    415 | Unsupported Media Type | 媒体类型不被支持,服务器拒绝该请求
    417 | Expectation Failed
    500 | Internal Server Error | 未完成请求,服务器遇到意外情况
    501 | Not Implemented | 未完成请求,服务器不支持所需的功能
    502 | Bad Gateway | 未完成请求,服务器从上游服务器收到无效响应
    503 | Service Unavailable | 未完成请求,服务器暂时超载或宕机
    504 | Gateway Timedout | 网关超时
    505 | HTTP Version Not Supported | 服务器不支持HTTP协议版本
    2.通过HttpServletResponse对象设置状态码
    ①setStatus(int statusCode) 若响应包含特殊状态码和文档,确保使用PrintWriter返回内容前调用setStatus;
    ②sendRedirect(String url) 生成302响应,连同带有新文档URL的Location头;
    ③sendError(int code, String message) 发送状态码(常为404),连同一个在HTML内自动格式化并发送到客户端的短消息;

    九、过滤器
    ——————————————————————————
    1.Servlet 过滤器是一种Java类,可①在客户端请求访问后端资源之前拦截这些请求;②在服务器响应发送回客户端之前,处理这些响应。
    过滤器可附加到JSP文件和HTML页面中,在调用Servlet 前调用所有附加的Servlet 过滤器。
    2.过滤器类型
    ①身份验证过滤器(Authentication Filters)
    ②数据压缩过滤器(Data compression Filters)
    ③加密过滤器(Encryption FIlters)
    ④触发资源访问事件过滤器
    ⑤图像转换过滤器(Image Conversion FIlters)
    ⑥日志记录审核过滤器(Logging and Auditing Filters)
    ⑦MIME-TYPE链过滤器(MIME-TYPE Chain FIlters)
    ⑧标记化过滤器(Tokenizing Filters)
    ⑨XSL/T过滤器(XSL/T Filters)
    3.过滤器类实现javax.servlet.Filter接口的方法:
    ①doFilter(ServletRequest, ServletResponse, FilterChain):完成实际的过滤操作,请求方法设置匹配的URL时,Servlet 容器先调用过滤器的doFilter,FilterChain用户访问后续过滤器;
    ②init(FilterConfig filterConfig):web应用启动时,服务器创建Filter实例并调用其init方法,读取web.xml配置,为后续的用户请求作拦截准备工作(filter对象只会创建一次,init方法也只执行一次);
    ③destroy():过滤器实例被web容器从服务移除之前调用,释放资源;
    4.init方法的FilterConfig对象能获取当前filter的配置。
    如web.xml文件配置如下:
    <filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.runoob.test.LogFilter</filter-class>
    <init-param>
    <param-name>Site</param-name>
    <param-value>菜鸟教程</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>LogFilter</filter-name>
    <url-pattern>/*</url-pattern> //该过滤器适用于所有Servlet ,应用到特定的Servlet 需要指定特定的Servlet 路径。
    </filter-mapping>
    通过FilterConfig对象获取参数:
    public void init(FilterConfig config) throws ServletException {
    // 获取初始化参数
    String site = config.getInitParameter("Site");
    // 输出初始化参数
    System.out.println("网站名称: " + site);
    }
    5.多个过滤器只需在web.xml中定义多个<filter>元素即可,filter-mapping元素的顺序决定了web容器应用过滤器的顺序。
    6.过滤器配置节点说明:
    <filter>指定过滤器;<filter-name>指定过滤器名;<filter-class>指定过滤器的限定类名;<init-param>指定过滤器初始化参数,其子元素<param-name>指定参数名,<param-value>指定参数的值。
    <filter-mapping>设置Filter负责拦截的资源。有两种指定方式:Servlet 名或资源访问的请求路径。<filter-name>设置filter的注册名,需是<filter>中声明过的过滤器名。<url-pattern>filter拦截的请求路径。
    <servlet-name>过滤器所拦截的Servlet 名。
    <sidpatcher>指定过滤器拦截资源被Servlet 容器调用的方式,有REQUEST(默认,用户直接访问页面是,调用过滤器), INCLUDE(目标资源通过RequestDispatcher的include()访问,过滤器调用), FORWARD(目标资源通过RequestDispatcher的forward()访问,过滤器调用), ERROR(目标资源通过声明式异常处理机制调用,过滤器被调用)。

    十、异常处理
    ——————————————————————————
    Servlet 抛出异常时,Web容器在web.xml的exception-type元素中搜索与抛出异常类型匹配的配置。必须在web.xml中使用error-page元素来指定对特定异常或HTTP状态码做出响应的Servlet 调用。
    1.ErrorHandler

    <servlet>
    <servlet-name>ErrorHandler</servlet-name>
    <servlet-class>ErrorHandler</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>ErrorHandler</servlet-name>
    <url-pattern>/ErrorHandler</url-pattern>
    </servlet-mapping>

    //404、403错误码都会调用ErrorHandler的Servlet
    <error-page>
    <error-code>404</error-code>
    <location>/ErrorHandler</location>
    </error-page>
    <error-page>
    <error-code>403</error-code>
    <location>/ErrorHandler</location>
    </error-page>

    // 抛出ServletException或IOExceptionWeb容器都会调用ErrorHandler的Servlet
    <error-page>
    <exception-type>
    javax.servlet.ServletException //所有异常的通用处理程序指定为java.lang.Throwable
    </exception-type >
    <location>/ErrorHandler</location>
    </error-page>

    <error-page>
    <exception-type>java.io.IOException</exception-type >
    <location>/ErrorHandler</location>
    </error-page>
    2.Servlet 可访问的错误处理请求属性列表,用于分析错误/异常的性质
    ①javax.servlet.error.status_code:访问状态码,存为Integer类型;
    ②javax.servlet.error.exception_type:异常类型信息,存为Class类型;
    ③javax.servlet.error.message:错误消息,为String;
    ④javax.servlet.error.request_uri:有关URL调用Servlet的信息,为String;
    ⑤javax.servlet.error.exception:异常产生的信息,为Throwable类型;
    ⑥javax.servlet.error.servlet_name:Servlet名;

    十一、Cookie处理
    ——————————————————————————
    Cookie是存储在客户端计算机上的文本文件,保留了可跟踪的信息。识别返回用户包含三步:①服务器向浏览器发送一组Cookie(姓名、年龄、识别号等);②浏览器将信息存储在本地计算机备用;③将来浏览器向Web服务器发送请求
    Cookie处理需对中文进行编解码:

    String str = java.net.URLEncoder.encode("中文","UTF-8"); //编码
    String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // 解码
    1.Cookie常设置在HTTP头信息中,如:
    HTTP/1.1 200 OK
    Date: Fri, 04 Feb 2000 21:03:38 GMT
    Server: Apache/1.3.9 (UNIX) PHP/4.0b3
    Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=runoob.com //Set-Cookie头包含名称值(被URL编码)、GMT日期、路径和域。expires字段为一个指令(浏览器在指定日期后“忘记”该Cookie)
    Connection: close
    Content-Type: text/html
    浏览器指向匹配该Cookie路径与域的页面,将重新发送Cookie到服务器,Servlet 就能通过request.getCookies()访问Cookie。浏览器的头信息如下:
    GET / HTTP/1.0
    Connection: Keep-Alive
    User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
    Host: zink.demon.co.uk:1126
    Accept: image/gif, /
    Accept-Encoding: gzip
    Accept-Language: en
    Accept-Charset: iso-8859-1,*,utf-8
    Cookie: name=xyz

    2.操作Cookie的方法列表
    ①setDomain(String pattern) 设置cookie适用域
    ②getDomain() 获取cookie适用域
    ③setMaxAge(int expiry) 设置cookie过期时间(秒为单位),不设置cookie将只在当前session中有效
    ④getMaxAge() 获取cookie最大生存周期,-1表示cookie持续至浏览器关闭
    ⑤getName() 返回cookie名称
    ⑥setValue(String newValue) 设置cookie关联值
    ⑦getValue() 获取cookie的关联值
    ⑧setPath(String uri) 设置cookie适用的路径。不设置则与当前页面(及其子目录)的URL共用同一个cookie
    ⑨getPath() 获取cookie适用路径
    ⑩setSecure(boolean flag) 指定cookie是否只在加密连接(SSL)上发送
    ①①setComment(String purpose) 设置cookie注释
    ①②getComment() 获取cookie注释
    3.通过Servlet 设置Cookie

    Cookie cookie = new Cookie("key", value"); //Cookie名或值不能包含空格或“=,"/?@:;”
    cookie.setMaxAge(606024); //设置最大生存周期,如24小时
    response.addCookie(cookie); //发送Cookie到HTTP响应头
    4.通过Servlet 删除Cookie
    cookie.setMaxAge(0); //读取cookie并设年龄为0
    response.addCookie(cookie); //将cookie添加会响应头

    十二、Session跟踪
    ——————————————————————————
    HTTP为无状态协议,每次客户端打开一个链接到Web服务器,之前请求的记录都不会被服务器保留。
    1.有以下维持Web客户端和服务器session会话的三种方式:
    ①Web服务器分配唯一的session会话ID作为cookie,但有很多浏览器不支持cookie;
    ②Web服务器发送隐藏HTML表单字段将session会话ID(<input type="hidden" name="sessionid" value="12345">)包含在GET、POST数据中。*但超文本链接不会提交表单;
    ③在URL末尾追加额外的数据来标识session会话,服务器根据session会话ID与已存储的数据相关联。如http://w3cschool.cc/file.htm;sessionid=12345,标识符sessionid=12345可被Web服务器用于访问客户端。不过,即使在静态HTML页面也会动态地生成URL区分session会话。
    2.HttpSession对象
    Servlet 提供了HttpSession接口来实现跨页面请求、访问网站的识别用户及存储用户信息的方式。HttpSession对象通过HttpServletRequest的getSession()来获取,该会话会持续一个指定的时间。
    3.HttpSession对象的重要方法
    ①getAttribute(String name) 返回会话中具有指定名称的对象;
    ②getAttributeNames() 返回绑定到该session会话的对象的枚举;
    ③getCreationTime() 返回session被创建的时间,单位毫秒;
    ④getId() 返回session的唯一标识符;
    ⑤getLastAccessedTime() 返回客户端最后一次发送该session会话相关请求的时间;
    ⑥getMaxInactiveInterval() 返回Servlet 在客户端访问时保持session打开的最大时间间隔,单位秒;
    ⑦invalidate() 指示session无效,并解除与之绑定的对象;
    ⑧isNew() 若客户端不知道或不参与该session,返回true;
    ⑨removeAttribute(String name) 移除指定名称的对象;
    ⑩setAttribute(String name, Object value) 绑定一个对象到该session;
    ①①setMaxInactiveInterval(int interval) 指定客户端请求之间的间隔,单位秒;
    4.删除Session会话数据
    ①移除特定的属性;
    ②删除整个session;
    ③设置session会话时间过期;
    ④注销用户,若服务器支持servlet 2.4,可用logout来注销客户端,并将术语用户的所有session设置为无效;
    ⑤web.xml配置session会话超时:
    <session-config>
    <session-timeout>15</session-timeout> //单位分钟
    </session-config>

    十三、数据库访问
    ——————————————————————————
    java项目只需引入mysql-connector-java-5.1.39-bin.jar,执行Class.forName("com.mysql.jdbc.Driver")就会查找数据库驱动。而Web项目需要把jar包放到tomcat的lib目录下。
    1.实例
    使用Servlet 访问RUNOOB数据库
    // 先设置JDBC驱动名及数据库URL,以及用户名和密码

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
    static final String USER = "root";
    static final String PASS = "123456";
    // 建立数据库连接及查询数据库
    Connection conn = null;
    Statement stmt = null;
    try{
    Class.forName("com.mysql.jdbc.Driver"); // 注册 JDBC 驱动器
    conn = DriverManager.getConnection(DB_URL,USER,PASS); // 打开一个连接
    stmt = conn.createStatement(); // 执行 SQL 查询
    String sql;
    sql = "SELECT id, name, url FROM websites";
    ResultSet rs = stmt.executeQuery(sql);
    ... //处理逻辑
    rs.close(); //释放数据库资源
    stmt.close();
    conn.close();
    }

    十四、文件上传
    ——————————————————————————
    上传文件需要
    upload.jsp:文件上传表单
    message.jsp:上传成功后跳转页面
    UploadServlet.java:上传处理Servlet
    commons-fileupload-1.3.2、commons-io-2.5.jar:依赖jar,引入到Web项目的WEB-INF/lib下
    1.upload.jsp如下:
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>文件上传实例 - 菜鸟教程</title>
    </head>
    <body>
    <h1>文件上传实例 - 菜鸟教程</h1>
    <form method="post" action="/TomcatTest/UploadServlet" enctype="multipart/form-data"> // method属性为POST,action属性设置为后端服务器处理文件上传的Servlet文件
    选择一个文件:
    <input type="file" name="uploadFile" />



    <input type="submit" value="上传" /> // 每个上传文件对应一个带有属性 type="file" 的 <input .../> 标签,浏览器为每个input标签关联一个浏览按钮
    </form>
    </body>
    </html>
    2.UploadServlet样例
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;

    @WebServlet("/UploadServlet")
    public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 上传文件存储目录
    private static final String UPLOAD_DIRECTORY = "upload";
    
    // 上传配置
    private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50; // 50MB
    /**
     * 上传数据及保存文件
     */
    protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        // 检测是否为多媒体上传
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是则停止
            PrintWriter writer = response.getWriter();
            writer.println("Error: 表单必须包含 enctype=multipart/form-data");
            writer.flush();
            return;
        }
    
        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        // 设置临时存储目录
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
    
        ServletFileUpload upload = new ServletFileUpload(factory);
         
        // 设置最大文件上传值
        upload.setFileSizeMax(MAX_FILE_SIZE);
         
        // 设置最大请求值 (包含文件和表单数据)
        upload.setSizeMax(MAX_REQUEST_SIZE);
    
        // 中文处理
        upload.setHeaderEncoding("UTF-8"); 
    
        // 构造临时路径来存储上传的文件
        // 这个路径相对当前应用的目录
        String uploadPath = request.getServletContext().getRealPath("./") +         File.separator + UPLOAD_DIRECTORY;
        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
    
        try {
            // 解析请求的内容提取文件数据
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);
    
            if (formItems != null && formItems.size() > 0) {
                // 迭代表单数据
                for (FileItem item : formItems) {
                    // 处理不在表单中的字段
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // 在控制台输出文件的上传路径
                        System.out.println(filePath);
                        // 保存文件到硬盘
                        item.write(storeFile);
                        request.setAttribute("message",
                            "文件上传成功!");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message",
                    "错误信息: " + ex.getMessage());
        }
        // *跳转到 message.jsp
        request.getServletContext().getRequestDispatcher("/message.jsp").forward(
                request, response);
    }
    

    }
    3.message.jsp文件:
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>文件上传结果</title>
    </head>
    <body>
    <center>
    <h2>${message}</h2>
    </center>
    </body>
    </html>

    十五、网页重定向
    ——————————————————————————
    文档位置变动、负载均衡或者为了随机,都要用到网页重定向。
    重定向方式:
    ①使用 response 对象的 sendRedirect() 方法,将响应以及状态码和新页面位置发送给浏览器
    public void HttpServletResponse.sendRedirect(String location) throws IOException
    ②通过setStatus()和setHeader()实现
    public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException
    {....
    String site = "http://www.runoob.com" ;
    response.setStatus(response.SC_MOVED_TEMPORARILY);
    response.setHeader("Location", site);
    ....}

    十六、点击计数器
    ——————————————————————————
    1.网页点击计数器
    实现基于Servlet 生命周期的网页点击计数器需要采取的步骤:
    ①在 init() 方法中初始化一个全局变量。
    ②每次调用 doGet() 或 doPost() 方法时,都增加全局变量。
    ③如果需要,您可以使用一个数据库表来存储全局变量的值在 destroy() 中。在下次初始化 Servlet 时,该值可在 init() 方法内被读取。这一步是可选的。
    ④如果您只想对一个 session 会话计数一次页面点击,那么请使用 isNew() 方法来检查该 session 会话是否已点击过相同页面。这一步是可选的。
    ⑤您可以通过显示全局计数器的值,来在网站上展示页面的总点击量。这一步是可选的。
    2.通过过滤器实现网站点击计数器
    ①在过滤器的 init() 方法中初始化一个全局变量。
    ②每次调用 doFilter 方法时,都增加全局变量。
    ③如果需要,您可以在过滤器的 destroy() 中使用一个数据库表来存储全局变量的值。在下次初始化过滤器时,该值可在 init() 方法内被读取, 这一步是可选的。

    十七、自动刷新页面
    ——————————————————————————
    Servlet 使用响应对象的setIntHeader()方法,将头信息"Refresh" 以及间隔值(单位秒)传给浏览器,可实现网页的定期刷新。

    response.setIntHeader("Refresh", 5);

    十八、发送电子邮件
    ——————————————————————————
    发送电子邮件需要JavaMail API及Java Activation Framework(JAF),需要引入对应的依赖包javax.mail.jar和javax.activation.jar。

    十九、Servlet 包
    ——————————————————————————
    Java web 应用程序的程序目录结构由Servlet API规范指定,其WEB-INF的目录结构如下:
    |myapp // HTML文件
    |--images
    |--WEB-INF // 程序的部署描述文件web.xml
    |--classes // Servlet 类和其他类文件
    |--lib

    二十、调试技巧
    ——————————————————————————
    1.System.out.println() 是作为一个标记来使用的,用来测试一段特定的代码是否被执行。也可以打印出变量值检查。
    优点:System为Java核心部分,能被用于任何地方;无需断点,不干扰程序的执行流程。
    2.ServletContext.log()打印日志到容器的日志文件。Tomcat的日志可在 <Tomcat-installation-directory>/logs 目录中找到。
    3.使用调试applet或应用程序的jdb命令来调试Servlet。通过调试 sun.servlet.http.HttpServer,将其看成是HttpServer 执行 Servlet 来响应浏览器端的 HTTP 请求。调试前要为调试器设置好sun.servlet.http.Http-Server, servlet 及支持类的CLASSPATH。
    *server_root/servlets设置在CLASSPATH会禁用servlet 的重新加载,但能使调试器在 HttpServer的自定义 Servlet 加载器加载 Servlet 之前在 Servlet 中设置断点。
    在想要调试的Servlet代码中设置断点,然后通过 Web 浏览器使用给定的 Servlet(http://localhost:8080/servlet/ServletToDebug)向 HttpServer 发出请求,程序执行到断点处会停止。
    4.使用注释定位bug,若注释代码块后bug消失,说明问题在注释块中。
    5.查看客户端、服务器的头信息(HTTP请求和响应)。
    6.其他技巧:
    ①要求浏览器显示它所显示的页面的原始内容。这有助于识别格式的问题。它通常是"视图"菜单下的一个选项。
    ②强制执行完全重新加载页面来确保浏览器还没有缓存前一个请求的输出。
    ③确认 servlet 的 init() 方法接受一个 ServletConfig 参数,并调用 super.init(config)。

    二十一、国际化
    ——————————————————————————
    通过区域设置能让网页呈现当地的语言、符号以及网站版本。 request 对象中返回 Locale 对象的方法:
    java.util.Locale request.getLocale()
    国际化(i18n):网站提供不同版本的翻译内容;
    本地化(l10n):向网站添加资源,使其适应特定的文化区域,如网站译为印地文;
    区域设置(locale):特殊的文化区域,通常以语言符号跟国家符号区分,如"en_US"表示针对US的英语区域设置。

    二十二、相关资料
    ——————————————————————————
    1.相关网站
    ①Sun's Site on Servlets ](http://java.sun.com/products/servlet/)- Sun 的官方网站上关于 Servlet 的相关资料。
    ②JSP Engine - Tomcat ](http://tomcat.apache.org/)- Apache Tomcat 是一个开源软件,实现了对 Java Servlet 和 JSP(JavaServer Pages)技术的支持。
    ③MySQL Connector/J](http://dev.mysql.com/downloads/connector/j/5.1.html) - MySQL Connector/J 是 MySQL 官方 JDBC 驱动程序。
    ④The JavaTM Tutorials](http://java.sun.com/docs/books/tutorial/index.html) - 该 Java 教程是为那些想用 Java 编程语言创建应用程序的编程人员提供的实用指南。
    ⑤JavaTM 2 SDK, Standard Edition ](http://java.sun.com/j2se/1.4.2/docs/index.html)- JavaTM 2 SDK, Standard Edition 的官网。
    ⑥Free Java Download](http://www.java.com/en/download/index.jsp) - 为您的桌面计算机下载 Java!
    ⑦Sun Developer Network](http://java.sun.com/reference/docs/) - Sun Microsystem 的官方网站,上面列出了所有的 API 文档,最新的 Java 技术、书籍和其他资源。
    2.相关书籍
    ①Core JavaServer Faces
    ②Java7:A Beginner's Tutorial
    ③Head First Java
    ④Murach's Java Servlets and JSP
    ⑤Head First Servlets and JSP
    ⑥Servlet and JSP
    ——————————————————————————
    参考自runoob.com,侵删。

    相关文章

      网友评论

          本文标题:#前端 Servlet

          本文链接:https://www.haomeiwen.com/subject/omptnltx.html