分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

Servlet,jsp,jsp的9大内置对象

发布时间:2023-09-06 01:11责任编辑:赖小花关键词:jsjsp内置对象

以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 SetUp\develop environment setup\tts9\apache-tomcat-7.0.67\wtpwebapps\ServletProject\picture.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;第二种:ServletContext100 ????????//第一种方法classloader101 ????????//结果得到输入流:java.io.BufferedInputStream@324f9231102 ????????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 ????????//第二种方法ServletContext111 ????????//结果得到输入流:java.io.FileInputStream@37591de112 ????????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 ????@Override122 ????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方式都可以,不过就是太麻烦;

Servlet,jsp,jsp的9大内置对象

原文地址:http://www.cnblogs.com/lubolin/p/7511620.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved