zoukankan      html  css  js  c++  java
  • Servlet,jsp,jsp的9大内置对象

    以servlet作为控制器

    1:servlet的生命周期:以下方法都是servlet容器进行调用

    1)构造函数;只被调用一次,当项目启动时或者该servlet被容器第一次调用时,会创建servlet实例,所以servlet是单例模式。

    2)init方法:只被调用一次,当servlet实例创建成功后会立即调用init方法,用来初始化servlet;

    3)service方法:每次请求都会被调用一次,实际是用来响应请求的;

    4)destroy方法:只被调用一次,在当前servlet所在的web应用程序被卸载之前调用,用来释放servlet所占用的资源;

     servlet在web.xml中的配置(注册和映射)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     3         xmlns="http://java.sun.com/xml/ns/javaee" 
     4         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     5         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     6         version="2.5">
     7         
     8         <!-- 无论是在程序运行时就创建servlet实例并初始化,还是当访问servlet的时候在进行实例创建并初始化,
     9                 实例的创建和初始化只被进行一次,也就是说此单一实例是贯穿整个程序的运行周期的,程序停止,此实例就被
    10                 销毁,也就是servlet是单例模式的,所以存在线程安全问题 -->
    11         <!-- 配置HelloServlet -->
    12     <servlet>
    13         <servlet-name>HelloServlet</servlet-name>
    14         <servlet-class>com.yinfu.servlets.HelloServlet</servlet-class>
    15         
    16         <!-- 配置servlet的初始化参数 -->
    17         <init-param>
    18             <param-name>user</param-name>
    19             <param-value>root</param-value>
    20         </init-param>
    21         <init-param>
    22             <param-name>password</param-name>
    23             <param-value>12345</param-value>
    24         </init-param>
    25         
    26         <!-- 这个配置是“零或正数”当服务器启动servlet容器加载此web应用的时候就创建servlet实例,并进行初始化,此数值越小优先级越高,
    27                 如果没有这个配置或者此配置为“负数”,只有当访问此servlet的时候才会创建实例并初始化 -->
    28         <load-on-startup>1</load-on-startup>
    29     </servlet>
    30     <!-- 配置SecondServlet -->
    31     <servlet>
    32         <servlet-name>SecondServlet</servlet-name>
    33         <servlet-class>com.yinfu.servlets.SecondServlet</servlet-class>
    34         <load-on-startup>2</load-on-startup>
    35     </servlet>
    36     <!-- servlet映射,次映射是为了运行此servlet中的service内容代码而进行的配置 -->
    37     <servlet-mapping>
    38         <servlet-name>HelloServlet</servlet-name>
    39         <!-- '/'代表当前项目的根目录:'http://127.0.0.1:8080/ServletProject/' -->
    40         <url-pattern>/hello</url-pattern>
    41     </servlet-mapping>
    42 
    43 </web-app>

    2:servlet映射:

    1)同一个servlet可以被映射到多个URL上,即多个<servlet-mapping>中的<servlet-name>可以使同一个servlet

    2)当servlet映射到的URL中使用通配符  *  时,只有两种固定格式

      一种是:*.扩展名  二种是:/*

    3:servletAPI中servletConfig中的方法:

    1)ServletConfig的 getInitParameter(String str);用来获得指定的servlet初始化参数,返回值类型:String

    2)ServletConfig的 getInitParameterNames();用来获得所有初始化参数的参数名,返回值类型:Enumeration<String>

    3)ServletConfig的 getServletName();用来获取servlet注册时的注册名的(很少用)

      即:<servlet-name>HelloServlet</servlet-name>中的HelloServlet

    4)ServletConfig的 getServletContext();用来获取当前WEB应用的上下文对象,从而获得当前WEB应用中的各方面信息

    5)ServletRequest 封装了用户的请求信息,可以从中获取到任何的请求信息;(HttpServletRequest是他的子类)

    6)ServletResponse 封装了响应信息;(HttpServletResponse为他的子类)

    用法如下:

      1 package com.yinfu.servlets;
      2 
      3 import java.io.IOException;
      4 import java.io.InputStream;
      5 import java.util.Enumeration;
      6 
      7 import javax.servlet.Servlet;
      8 import javax.servlet.ServletConfig;
      9 import javax.servlet.ServletContext;
     10 import javax.servlet.ServletException;
     11 import javax.servlet.ServletRequest;
     12 import javax.servlet.ServletResponse;
     13 
     14 public class HelloServlet implements Servlet {
     15 
     16     @Override
     17     public void destroy() {
     18         System.out.println("销毁HelloServlet的实例");
     19     }
     20 
     21     @Override
     22     public ServletConfig getServletConfig() {
     23         System.out.println("getServletConfig");
     24         return null;
     25     }
     26 
     27     @Override
     28     public String getServletInfo() {
     29         System.out.println("getServletInfo");
     30         return null;
     31     }
     32 
     33     @Override
     34     public void init(ServletConfig servletConfig) throws ServletException {
     35         System.out.println("将HelloServlet的实例进行初始化");
     36         
     37         /**
     38          * 此方法是用来获取web.xml中的init-param中的初始化参数的(局部变量,仅限于此servlet)
     39          * user=root
     40          */
     41         String user = servletConfig.getInitParameter("user");
     42         System.out.println("user=" + user);
     43         /**
     44          * 此输出会将init-param中的所有初始化参数全部输出
     45          * (Enumeration接口本身不是一个数据结构。但是,对其他数据结构非常重要)
     46          * user:root
     47          * password:12345
     48          */
     49         Enumeration<String> names = servletConfig.getInitParameterNames();
     50         while(names.hasMoreElements()){
     51             String name = names.nextElement();
     52             String value = servletConfig.getInitParameter(name);
     53             System.out.println(name +":"+ value);
     54         }
     55         /**
     56          * 此getServletName()方法是用来获取web.xml中<servlet-name>HelloServlet</servlet-name>的HelloServlet
     57          * 此方法很少用;
     58          * servletName:HelloServlet
     59          */
     60         String servletName = servletConfig.getServletName();
     61         System.out.println("servletName:"+servletName);
     62         /**
     63          * Servlet引擎为每个WEB应用程序都创建了一个ServletContext对象,ServletContext对象包含在ServletConfig对象中
     64          * 调用ServletConfig的getServletContext()方法可以返回ServletContext对象的引用
     65          * 而WEB应用程序中的每一个servlet都共用同一个ServletContext对象,ServletContext对象又被称之为application对象
     66          * (应用程序对象)功能:
     67          * ①。获取WEB应用程序的初始化参数
     68          * ②。记录日志
     69          * ③。application域范围的属性
     70          * ④。访问资源文件
     71          * ⑤。获取虚拟路径所映射的本地路劲
     72          * ⑥。WEB应用程序之间的访问
     73          * ⑦。ServletContext对象的其他方法
     74          */
     75         //获取ServletContext对象
     76         ServletContext context=servletConfig.getServletContext();
     77         //用来获取指定的ServletContext的初始化参数(成员变量,范围为整个WEB程序)
     78         //contextName=com.mysql.jdbc.driver
     79         String contextName = context.getInitParameter("driver");
     80         System.out.println("contextName="+contextName);
     81         //获取所有的ServletContext的初始化参数
     82         //driver:com.mysql.jdbc.driver
     83         //jdbcUrl:jdbc:mysql://apache
     84         Enumeration<String> contextNames = context.getInitParameterNames();
     85         while(contextNames.hasMoreElements()){
     86             String name = contextNames.nextElement();
     87             String contextValue = context.getInitParameter(name);
     88             System.out.println(name+":"+contextValue);
     89         }
     90         //获取WEB应用的某一个文件在服务器上的绝对路径,而不是部署前的路径(文件上传下载的时候会用到)
     91         //E:File SetUpdevelop environment setup	ts9apache-tomcat-7.0.67wtpwebappsServletProjectpicture.png
     92         String realPath=context.getRealPath("picture.png");
     93         System.out.println(realPath);
     94         //获取当前WEB应用的名称(关于页面绝对路径的时候会用到)
     95         //结果:/ServletProject
     96         String contextPath = context.getContextPath();
     97         System.out.println(contextPath);
     98         //获取当前WEB应用的某一文件对应的输入流
     99         //有两种方法呢第一种:classLoader;第二种:ServletContext
    100         //第一种方法classloader
    101         //结果得到输入流:java.io.BufferedInputStream@324f9231
    102         try {
    103             //这里的路径是该文件的类路径
    104             ClassLoader classLoader = getClass().getClassLoader();
    105             InputStream is = classLoader.getResourceAsStream("jdbc.properties");
    106             System.out.println(is);
    107         } catch (Exception e) {
    108             e.printStackTrace();
    109         }
    110         //第二种方法ServletContext
    111         //结果得到输入流:java.io.FileInputStream@37591de
    112         try {
    113             //这里的path是相对于当前WEB应用的相对路径,也就是服务器中被编译后的相对路径
    114             InputStream is = context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
    115             System.out.println(is);
    116         } catch (Exception e) {
    117             e.printStackTrace();
    118         }
    119     }
    120 
    121     @Override
    122     public void service(ServletRequest arg0, ServletResponse arg1)
    123             throws ServletException, IOException {
    124         System.out.println("HelloServlet的服务逻辑内容");
    125     }
    126     
    127     public HelloServlet(){
    128         System.out.println("创建HelloServlet的实例");
    129     }
    130 
    131 }

    4:所有以下内容结合GenericServlet抽象类的源码进行测试所得思想:

    5:以下为简单小例子HttpServlet的源码分析后所得:

    简写代码:(自定义代码,非真正源码)

    实际的service方法源码是这样写的(替换上面的第一张图片):

    通过以上源码分析所得思想:

    5:jsp中的9大隐含对象;

    当程序运行加载的时候,jsp文件会生成一个.java源文件;如图:

    生成的.java文件类继承了HttpJspBase父类,而在HttpJspBase源码中HttpJspBase继承了HttpServlet父类,即:由jsp页面生成的.java文件也间接继承了HttpServlet父类,因此.java文件也是一个servlet,同样重写了init,destroy,service方法:

    因此在jsp中的所欲逻辑js代码以及HTML代码都会出现在.java文件的service方法中,而在响应的service方法中也会内置自定义一些属性如:

    这些属性:request,response,pageContext,session,application,config,out,page还有一个exception共九个内置对象,这些内置对象就是jsp的9大隐含对象,在jsp文件中可以直接使用;但这种使用的方法只能是用java代码来使用,因此这些对象,以及调用的方法要写在标签<%%>中:

     6:jsp的语法:

    ①:模板元素:jsp中静态的HTML内容

    ②:jsp脚本片段(scriptlet),是指嵌套在<%%>标签之中的一条或者多条java代码,而多个脚本片段之间的代码可以进行相互访问;

    ③:jsp表达式<%= %>,他可以将java变量或者表达式的计算结果直接输出到客户端浏览器页面上;

    <%

      Date date=new Date()

    %>

    <%= date  %>

    ④:

    (jsp页面中几乎从来不这样用)

    ⑤:

     7:和属性相关的方法:

    8:请求的转发和重定向:

    HttpServletRequest request;HttpServletResponse response;

    请求转发:

    String path="testServlet";
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);
    requestDispatcher.forward(request, response);

    请求重定向:

    response.sendRedirect("testServlet");

     

    9:将一jsp文件引入到另一个jsp文件中:(在实际开发中,这两种引入方式都可以交替使用,只做了解)

     

    10:jsp中文乱码解决方案:

    由于中文参数在传递过程中默认的编码是ISO-8859-1;当用此编码进行解码然后在用"UTF-8"进行编码这样就可以解决中文乱码问题,这种方法无视请求方式,get和post方式都可以,不过就是太麻烦;

  • 相关阅读:
    一周最新示例代码回顾 (4/23–4/29)
    优酷的投票
    Google API获取用户信息
    CPU性能分析
    有意思的排序算法快速排序
    http响应LastModified和ETag以及asp.net web api实现
    java/C#多态漫谈
    有意思的排序算法插入排序
    [Architecture Pattern] Repository
    50个jQuery代码段帮你成为更出色的JS开发者
  • 原文地址:https://www.cnblogs.com/lubolin/p/7511620.html
Copyright © 2011-2022 走看看