美文网首页
servlet快速笔记

servlet快速笔记

作者: 61etj | 来源:发表于2018-10-28 00:27 被阅读0次

    Servlet

    当Servlet小于2.5时,需要填写配置文件web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>WEB13</display-name>
      
        //配置servlet
      <servlet>
        <servlet-name>abc</servlet-name>
        <servlet-class>com.itheima.servlet.QuickStratServlet</servlet-class>
        <init-param>
            <param-name>url</param-name>
            <param-value>aaa</param-value>
        </init-param>  
        
        //配置servlet在服务器启动时创建对象,优先级取值为[1,5],数字越小越高
        //Servlet默认第一次访问Servlet时创建
        <load-on-startup>3</load-on-startup>
    </servlet>
    
        //配置映射
      <servlet-mapping>
        <servlet-name>abc</servlet-name>
        //1完全匹配
        <url-pattern>/quickStratServlet</url-pattern>
        //2目录匹配 代表访问a目录下的b的任意资源
        <url-pattern>/a/b/*</url-pattern>
        //3扩展名匹配 代表访问任意以aaa为后缀的文件
        <url-pattern>*.aaa</url-pattern>
        //注意2和3不要混用
    
        //缺省的servlet,当所有的资源请求都没有匹配时,使用缺省servlet
        <url-pattern>/</url-pattern>
        //注意:使用缺省会无法正常访问普通的静态资源,因为项目的缺省映射将Tomcat的全局缺省映射覆盖了,而所有静态资源输出都是又Tomcat的缺省servlet做的,所有的响应都是由servlet负责,包括静态资源。
    
      </servlet-mapping>
    
        //默认打开网页格式
      <welcome-file-list>
        <welcome-file>1.html</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    

    创建Servlet实例

    //实现Servlet
    public class QuickStratServlet implements Servlet{
    
        //Servlet默认第一次访问Servlet时创建
        @Override
        public void init(ServletConfig config) throws ServletException {
            //ServletConfig config 是 servlet 的配置信息
    
            //1、获得servlet的name----<servlet-name>abc</servlet-name>
            String servletName = config.getServletName();
            System.out.println(servletName);//abc
    
            //2、获得该servlet的初始化的参数(来源于配置文件)
            String initParameter = config.getInitParameter("url");
            System.out.println(initParameter);
    
            //3、获得Servletcontext对象
            ServletContext servletContext = config.getServletContext();
            
            System.out.println("init running....");
        }
        
        //每次请求都会经过此方法
        @Override
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            System.out.println("QuickStratServlet running....");
            res.getWriter().write("QuickStratServlet running....");
        }
        
        //服务器关闭Servlet销毁的时候会执行
        @Override
        public void destroy() {
            System.out.println("destroy running....");
        }
        
        
        
        @Override
        public ServletConfig getServletConfig() {
            // TODO Auto-generated method stub
            return null;
        }
    
    
        @Override
        public String getServletInfo() {
            // TODO Auto-generated method stub
            return null;
        }
    
    
    }
    

    域对象

    概念

    存储数据区域及是域对象,类似于一个全局的仓库,给web资源共享数据使用


    ServletContext

    概念

    代表当前web应用的环境上下文对象,ServletContext对象内部封装是该web应用的信息,一个web应用只存在一个ServletContext对象。

    域对象固有方法
    void setAttribute(String key,Object value);//存入数据
    Object value = getAttribute(String key);//取出数据
    removeAttribute(String key);//移除数据
    

    生命周期

    创建:当前web应用被加载(服务器启动或发布web应用)
    销毁:web应用被卸载(服务器关闭,移除该web应用)

    • 获取

        //Servlet子类中
        this.getServletContext();
      
        //init(ServletConfig config)
        config.getServletContext();
      
    • 使用

    1. 获取web应用全局初始化参数 
        
        - 配置
    
                //web.xml配置,在<web-app>根节点下
                <context-param>
                    <param-name>driver</param-name>
                    <param-value>com.mysql.jdbc.Driver</param-value>
                </context-param>
    
        - 获取
    
                ServletContext context = getServletContext();
                String initParameter = context.getInitParameter("driver");
    
    2. 获取web应用中任何资源的绝对路径
    
            //通过相对地址 (web项目相对地址) 获取绝对路径
            String path = getRealPaht(String path);
    
            //通过类加载器来通过相对地址 (class相对地址) 来获取绝对路径
            String path = ContextServlet.class.getClassLoder().getResource(String path).getPath();
    
            getMimeType(String filename);//根据文件名自动判断类型并返回
        
    3. 域对象
    
        > ServletContext域对象的作用范围:整个web应用中所有的web资源
        > (servlet,jsp..)都可以随意向ServletContext存取数据,达成数据共享。
    
            void setAttribute(String key,Object value);//存入数据
            Object value = getAttribute(String key);//取出数据
            removeAttribute(String key);//移除数据
    

    HttpServletResponse

    页面响应对象,用于写页面

    使用
    setStatus(int statusCode);//设置状态码
    addHeader(String name,String value);//增加响应头
    addIntHeader(String name,int value);//一般用于设置数据长度
    addDateHeader(String name,long date);//一般用于设置时间
    setHeader(String name,String value);
    setDateHeader(String name,long date);
    setIntHeader(String name,int value);
    
    //重定向
    setStatus(302);
    setHeader("Location","/WEB14/servlet2");
    
    //重定向简写
    sendRedirect(String url);
    
    //定时刷新,延时5秒重定向到百度
    setHeader("refresh","5;url=http://www.baidu.com");
    
    setCharacterEncoding("UTF-8");//设置编码,此方法必须在getWriter前使用才有效
    setHeader("Content-Type","text/html;charset=UTF-8");//设置浏览器使用UTF-8来解析,同时此方法包含setCharacterEncoding,也会对输出设置编码
    setContentType("text/html,charset=UTF-8");//同上,快捷写法
    PrintWriter getWriter();//获取字符输出流
    
    getOutputStream();//获取字节输出流,不能与getWriter()同时出现否则会报错
    
    setHeader("Content-Disposition","attachment;filename="+filename);//下载的文件名
    

    HttpServletRequest

    网页请求对象,用于获取请求信息

    使用

    String getMethod();//获取请求协议
    String getRequestURI();//获取请求资源地址(相对)
    String getRequestURL();//获取网络请求地址
    String getContextPath();//获取web应用名称
    String getQueryString();//get提交的参数字符串       
    
    String getRomoteAddr();//获得客户端的ip地址
    
    long getDateHeader(String name);//获取时间请求头
    String getHeader(String name);//获取请求头
    Enumeration getHeaderNames();//获取请求头名字的枚举
    Enumeration getHeaders(String name);//获取请求头中值的枚举
    int getIntHeader(String name);
    
    String getParameter(String name);//获取参数
    String[] getParameterValues(String name);//获取多个参数
    Enumeration getParameterNames();//获取所有参数名枚举
    Map<String,String[]> getParameterMap();//获取参数键值对
    
    //转发
    RequestDispatcher getRequestDispatcher(String path);//获得一个请求转发器
    forward(ServletRequest request,ServletResponse response)
    
    参数出现乱码

    原因:post参数是保存在流内而get参数保存在地址,所以Post设置setCharacterEncoding即可将流内参数编码设置好,而get只能通过将iso8859-1转换为utf-8来解决

    //如果是Post参数出现乱码设置request编码即可
    request.setCharacterEncoding("UTF-8");
    
    //如果是get参数出现乱码,也适用于Post
    new String(username.getBytes("iso8859-1"),"UTF-8");
    

    Cookie

    客户端会话空间,一次会话(打开浏览器访问,到关闭浏览器)产生一个,Cookie仅能存非中文字符串

    Cookie cookie = new Cookie(String cookieName,String cookieValue)
    response.addCookie(Cookie cookie);
    

    如果不携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息

    setPath(String path);//设置Cookie携带路径
    

    持久化,如果不设置持久化时间,cookie会存储在浏览器内存中,浏览器关闭cookie信息销毁,如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里

    setMaxAge(int seconds);//设置持久化时间
    

    获取cookie

    Cookie[] cookies = request.getCookies();//通过request获取所有cookie
    if(cookies!=null){
        for(Cookie coo : cookies){
            coo.getName();//通过遍历获取Cookie的key
            coo.getValue();//通过遍历获取Cookie的value
        }
    
    }
    

    Session

    服务器会话空间,一次会话(打开浏览器访问,到关闭浏览器)产生一个。

    此技术是基于cookie,cookie储存了session编号---JSESSIONID

    HttpSession session = request.getSession();//获取当前会话的session对象,服务器不存在该session则创建,存在则获取
    String getId();//获取JSESSIONID
    
    //域对象固有方法传递共享数据
    void setAttribute(String key,Object value);//存入数据
    Object value = getAttribute(String key);//取出数据
    removeAttribute(String key);//移除数据 
    

    生命周期

    • 创建:第一次执行request.getSession()时创建

    • 销毁:

      1. 服务器(非正常)关闭

      2. session过期/失效(默认不操作服务端资源后30分钟)

        可以在工程的web.xml进行配置

         <session-config>
             <session-tiomeout>30</session-timeout>
         </session-config>
        
      3. 手动销毁

         session.invalidate();
        

    持久化

    将JSESSIONID的cookie持久化

    相关文章

      网友评论

          本文标题:servlet快速笔记

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