zoukankan      html  css  js  c++  java
  • 学习笔记--Servlet技术

    -------------------------------------------------------------------------------------------------------------------------------------
    //Servlet概述
    一个servlet就是一个java类,并提供基于请求-响应模式的web服务。

    //创建Servlet
    新建继承HttpServlet的类,覆盖init(), destroy(), service(HttpServletRequest req, HttpServletResponse res), doGet(HttpServletRequest req, HttpServletResponse res)方法

    //配置Servlet
    在web.xml中servlet项加入<init-param>项,如:
    <servlet>
       <init-param>
     <param-name>data1</param-name>
     <param-value>value1</param-value>
    </init-param>
    <init-param>
     <param-name>data2</param-name>
     <param-value>value2</param-value>
    </init-param>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.netease.server.example.web.controller.TestServlet</servlet-class>
    </servlet>
    代码中相应方法:
            ServletConfig config = this.getServletConfig();
            String v1 = config.getInitParameter("data1");  

    全局配置:
    在servlet项外加入<context-param>项,如:
    <context-param>
     <param-name>globalData1</param-name>
     <param-value>123</param-value>
    </context-param>
    代码中相应方法:
            ServletContext context = this.getServletContext();
            String globalV1 = context.getInitParameter("globalData1");  

    ServletMapping匹配规则:
    <url-pattern>支持模糊匹配
    精确路径匹配(完全匹配)---> 最长路径匹配(最长前缀匹配)--->  扩展名匹配 ---> default servlet或放弃

    更改servlet默认启动时间:
    在<servlet>元素中增加<load-on-startup>元素,负数为第一次请求时启动该servlet,大于等于0则在servlet容器启动时启动servlet,数字越小,优先级越高,如:
    <load-on-startup>0</load-on-startup>

    配置错误页面:
    <error-page>
        <error-code>404</error-code>
        <location>/404.html</location>
    </error-page>

    配置欢迎页面:
    <welcom-file-list>元素,可包含多个<welcom-file>元素,顺序加载

    MIME类型映射
    <mime-mapping>定义扩展文件名映射类型,包含两个子元素:<extension>和<mime-type>


    //Servelt共享动态属性
    一个servlet代码中:
            ServletContext context = this.getServletContext();  
            context.setAttribute("attribute1""123");  
    另一个servlet代码中:
            String globalV1 = (String)context.getAttribute("attribute1");  

    //Servlet读取外部资源配置文件信息
    三种方法:
    1. getResource
    代码如:
                ServletContext context = this.getServletContext();  
                URL url = context.getResource("/WEB-INF/log4j.properties");
                InputStream in = url.openStream();
                String propertyValue = GeneralUtil.getPropery("log4j.rootCategory"in);  

    2. getResourceAsStream
    代码如:
            InputStream in2 = context.getResourceAsStream("/WEB-INF/log4j.properties");
            String p2 = GeneralUtil.getPropery("log4j.rootCategory"in2); 
     
    3. getRealPath
    代码如:
            String path = context.getRealPath("/WEB-INF/log4j.properties");
            File file = new File(path);
            InputStream in3 = new FileInputStream(file);
            String p3 = GeneralUtil.getPropery("log4j.rootCategory"in3);  


    //HttpServletRequest实现类方法:
    1. 获得客户机信息
    getRequestURL方法返回客户端发出请求时的完整URL。
    getRequestURI方法返回请求行中的资源名部分。
    getQueryString 方法返回请求行中的参数部分。
    getRemoteAddr方法返回发出请求的客户机的IP地址
    getRemoteHost方法返回发出请求的客户机的完整主机名
    getRemotePort方法返回客户机所使用的网络端口号
    getLocalAddr方法返回WEB服务器的IP地址。
    getLocalName方法返回WEB服务器的主机名
    getMethod得到客户机请求方式
    getServerPath()获取请求的文件的路径

    2. 获得客户机请求头
    getHeader(string name)方法
    getHeaders(String name)方法
    getHeaderNames方法

    3. 获得客户机请求参数(客户端提交的数据)
    getParameter(name)方法 获取请求中的参数,该参数是由name指定的
    getParameterValues(String name)方法 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
    getParameterNames方法 返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名。
    getCharacterEncoding() 返回请求的字符编码方式
    getAttributeNames()返回当前请求的所有属性的名字集合赋值:setAttribute()
    getAttribute(String name) 返回name指定的属性值
    getsession()返回和客户端相关的session,如果没有给客户端分配session,则返回null
    getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组
    addHeader(String name,String value)  将指定的名字和值加入到响应的头信息中
     
    //HttpServletResponse实现类方法:
    encodeURL(String url)  编码指定的URL
    sendError(int sc)  使用指定状态码发送一个错误到客户端
    setDateHeader(String name,long date)  将给出的名字和日期设置响应的头部
    setHeader(String name,String value)  将给出的名字和值设置响应的头部
    setStatus(int sc)  给当前响应设置状态码
    setContentType(String ContentType)  设置响应的MIME类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。输出流的 HTTP MIME 类型。默认值为“text/html”
    getOutputStream()  字节输出流对象
    getWriter()   字符的输出流对象

    //Cookie和Session
    关于Cookie
    cookie数量限制:20个,每个大小限制:4kb
            Cookie userNameCookie = new Cookie("userName"userName);  //创建cookie
            userNameCookie.setMaxAge(10 * 60);        //设置cookie有效时间
            response.addCookie(userNameCookie);        //在响应中加入cookie
            Cookie[] cookies = request.getCookies();        //从请求中获取cookie
            cookie.getValue();          //从cookie中获取值
            cookie.getName();          //从cookie中获取名字

    关于Session
    默认有效期30分钟,setMaxInactiveInterval设置有效期,invalidate使session失效
            HttpSession session = request.getSession();
            String name = (String) session.getAttribute("userName"); 
            session.setMaxInactiveInterval(2 * 60);
            session.setAttribute("userName"userName);
            session.invalidate();
    部署描述符web.xml中配置有效期:
    <session-config>
    <session-timeout>5</session-timeout>
    </session-config> 

    //请求转发与重定向
    请求转发:
    获取RequestDispatcher:
    方法1:
    RequestDispatcher rd = req.getRequestDispatcher("/forwardExample");        //可以是绝对路径或者相对路径
    方法2:
    RequestDispatcher rd = this.getServletContext().getNameDispatcher("ServletForwardExample"); //转发到的servlet名称
    或者
    RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/forwardExample");       //只能是绝对路径
    转发:
    rd.forward(req, resp);

    请求重定向:
    resp.sendRedirect("redirectExample");          //相对路径则访问本web,绝对路径可以访问其他web

    //过滤器与监听器
    启动顺序:ServletContext--->listener--->filter--->servlet
    过滤器:
    创建实现Filter接口的类作为过滤器,在web.xml中增加<filter>项和<filter-mapping>,可定义多个<filter>,可配置FilterConfig,如下:
    <filter>
    <init-param>
    <param-name>filterParam</param-name>
    <param-value>111</param-value>
    </init-param>
    <filter-name>TestFilter</filter-name>
    <filter-class>com.netease.server.example.web.controller.filter.TestFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/hello/world/*</url-pattern>
    </filter-mapping>
    代码中:
            String value = filterConfig.getInitParameter("filterParam");
    在doFilter方法中可对request进行处理,如:
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chainthrows IOException, ServletException {
            System.out.println("filter doFilter method");
            HttpServletRequest req = (HttpServletRequest) request;
            HttpSession session = req.getSession();
            if (session.getAttribute("username") == null) {
                HttpServletResponse res = (HttpServletResponse) response;
                res.sendRedirect("../index.html");
            } else {
                chain.doFilter(requestresponse);
            }
        }

    监听器:
    分类
    1. 监听应用程序环境 ServletContext
    ServletContextListener
    ServletContextAttributeListener
    2. 监听用户请求对象 ServletRequest
    ServletRequestListener
    ServletRequestAttributeListener
    3. 监听用户会话对象 HttpSession
    HttpSessionListener
    HttpSessionAttributeListener
    HttpSessionActivationListener
    HttpSessionBindingListener

    创建实现相关接口的类,如实现HttpSessionAttributeListener,ServletContextListener, ServletRequestListener接口的类
    在web.xml中增加<listener>项:
    <listener>
      <listener-class>com.netease.server.example.web.controller.listener.TestListener</listener-class>
    </listener>

    //Servlet并发处理
    特征:单实例,多线程,线程不安全
    变量的线程安全:
    --参数变量本地化
    --使用同步块synchronized
    属性的线程安全:
    --SerletContext线程不安全
    --HttpSession理论上线程安全
    --ServletRequest线程安全

    避免在Servlet中创建线程
    多个Servlet访问外部对象加锁
    在代码中加入
    synchronized (this) {
    ...
    }

    //JSP
    动态网页技术标准
    简化的servlet
    JSP = Html + Java + JSP tag

    JSP处理流程:
    客户端--->发送JSP请求--->JSP文件--->转换为Servlet文件--->编译为class文件--->执行并载入servlet实例--->返回响应到客户端

    JSP基本语法:
    1. 静态内容
    模板数据
    2. 指令
    page指令
    --定义页面的依赖属性,比如脚本语言、error页面、缓存需求等
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" import="java.util.*"%>
    include指令
    --包含其他文件
    <%@include file="../include/admin/adminHeader.jsp"%>
    taglib指令
    --引入标签库的定义
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
    3. 注释
    <%-- 注释 --%>
    4. 表达式
    <%= 表达式 %>
     如下:
    <p> Today's date: <%= (new java.util.Date()).toLocaleString() %> </p>
    5. 声明
    <%! declaration; [declaration; ] + ... %>
    如:<%! int a, b, c; %>
    6. 脚本
    <% 代码片段 %>
    如下:
    <% out.println("Your IP address is : " + request.getRemoteAddr()); %>

    JSP内置对象
    request             HttpServletRequest类的实例
    response          HttpServletResponse类的实例
    out                    PrintWriter类的实例,用于把结果输出至网页上
    session            HttpSession类的实例
    applicaiton       ServletContext类的实例,与应用上下文有关
    config               ServletConfig类的实例
    page                 类似于Java中的this关键字
    pageContext    PageContext类的实例,提供对JSP页面的所有对象以及所有命名空间的访问
    Exception         Exception类的对象,代表发生错误的JSP页面对应的异常对象

    常用标签库标签:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    遍历集合
    <c:forEach items="${thecs}" var="c">
    条件判断
    <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>


  • 相关阅读:
    双指针算法_最长连续不重复子列长度
    前缀和_子矩阵的和
    前缀和
    高精度算法_大数除以小数
    高精度算法_大数乘小数
    高精度算法_大数相减
    高精度算法_大数加法
    一维差分矩阵
    二维差分矩阵
    整数二分
  • 原文地址:https://www.cnblogs.com/kioluo/p/6860426.html
Copyright © 2011-2022 走看看