servlet 学习记录

来源:互联网 发布:暴雨网络天书九卷官网 编辑:程序博客网 时间:2024/05/17 11:57

Author : Janloong Do_O

servlet 生命周期

单实例 多线程

构造方法

只会调用一次,在第一次访问,即通过反射创建servlet对象的时候

init

只会调用一次

service

创建成功后多次调用

destory

servlet 停止的时候调用

servlet url配置

/

代表工程路径只配/ 代表此servlet是一个默认的servlet 任何找不到的url 会匹配此

*

必须加后缀名,后缀名不能为*
代表匹配任意的url

serlvet 创建时机

启动时创建

启动顺序从2 开始  因为1在tomcat默认配置中已经占用  <servlet>        <servlet-name>Servlet</servlet-name>        <servlet-class>com.janloong.webtest.Servlet</servlet-class>        <load-on-startup>2</load-on-startup>    </servlet>

servletConfig 对象获取

  获取的方式有两种:    1. 采用带参的init方法    2. 采用servlet实例拿取(不要写带参的init方法)    web.xml 配置     <servlet>        <servlet-name>spring3mvc</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>          <param-name>contextConfigLocation</param-name>          <param-value>classpath:spring-mvc.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup>      </servlet>    //拿到servletConfi对象        ServletConfig sc = this.getServletConfig() ;        //拿取配置的单个信息        //String name = sc.getInitParameter("name") ;         //System.out.println(name);        //拿取配置的多个信息        Enumeration<String> enu = sc.getInitParameterNames() ;        while(enu.hasMoreElements()){            String name = enu.nextElement() ;            System.out.println(name + ":" + sc.getInitParameter(name));        }

servletContext 对象获取

1. servletconfig.getServletContext2. this.getServletContext3. request.getSession().getServletContext()

一个域对象,底层有一个map集合,用来存储键值对

应用场景

全局对象中存取数据

获取全局配置参数

 <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>      classpath:spring-*.xml,      classpath*:/spring/spring-*.xml    </param-value>  </context-param>

请求转发

请求转发时有一个请求包含功能

获取资源文件

 * 获取资源文件有三种方式: * 1.采用 ServletContext对象获取 * 2.采用ResourceBundle类来获取 * 3.采用类加载器获取 * *             第一种方式:优点: 任意文件,任意路径 *                         缺点: 必须有web环境 *             第二种方式: 优点:简单方便 *                          缺点: 1.只能拿取properties文件 2. 只能拿取非web环境下的资源 *             第三种方式: 优点: 任意文件,任意路径 *                         缺点: 编写稍显麻烦 *1. // 拿到全局对象        ServletContext sc = this.getServletContext();        // 获取p1.properties文件的路径        String path = sc.getRealPath("/WEB-INF/classes/p1.properties");        System.out.println(path);        // 创建一个Properties对象        Properties pro = new Properties();        // 加载文件        try {            pro.load(new FileReader(path));        } catch (Exception e) {            e.printStackTrace();        }        // 读取k的值        System.out.println(pro.get("k"));2.// 拿取ResourceBundle对象(专门用来获取properties文件的信息)        ResourceBundle rb = ResourceBundle.getBundle("p1");        // 拿取文件中的内容太        System.out.println(rb.getString("k"));3. // 获取类加载器的方式        /*         * 1. 通过类名 ServletContext7.class.getClassLoader() 2. 通过对象         * this.getClass().getClassLoader() 3. Class.forName()         * 获取Class.forName("ServletContext7").getClassLoader()         */        InputStream in = this.getClass().getClassLoader()                .getResourceAsStream("p1.properties");        // 创建Properties对象        Properties pro = new Properties();        try {            pro.load(in);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        // 拿取文件的数据        System.out.println(pro.getProperty("k"));

域对象

web的四个域对象

page(jsp有效) request(一次请求) session(一次会话) application(当前web应用)+

page域指的是pageContextrequest域指的是request HttpServletRequestsession 域指的是 session HTTPSessionapplication 域指的是 application ServletContext

之所以他们是域对象,原因就是他们都内置了map集合,都有setAttribute getAttribute方法。+

他们都有自己固定的生命周期和作用域。这四个对象的生命周期(生命周期就是值对象的创建到销毁的期间)

中文乱码

//解决乱码问题//第一种办法:让用户在浏览器中选择解码(不靠谱)//第二种方式:通知浏览器采用某种编码进行解码//response.setHeader("Content-Type", "text/html;charset=UTF-8") ;//第三种方式:输出一个字符串//response.getOutputStream().write("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>".getBytes()) ;//response.getOutputStream().write(s.getBytes("utf-8")) ;//第四种方式 让服务器的编码用一种编码,通知浏览器的解码//response.setCharacterEncoding("UTF-8") ;//response.setHeader("Content-Type", "text/html;charset=UTF-8") ;////response.getOutputStream().write(s.getBytes("utf-8")) ;//第五种方法(推荐)response.setContentType("text/html;charset=utf-8") ; //此句代码做了两件事情: 1. 设定服务器将数据编码时用的码表 2. 通知浏览器解码用的码表

response 在使用IO流的时候,默认的

字节流是以 GBK编码返回的字符流是以 ISO-8859-1 编码返回的
原创粉丝点击