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中的配置(注册和映射)
<?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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5"> <!-- 无论是在程序运行时就创建servlet实例并初始化,还是当访问servlet的时候在进行实例创建并初始化,
实例的创建和初始化只被进行一次,也就是说此单一实例是贯穿整个程序的运行周期的,程序停止,此实例就被
销毁,也就是servlet是单例模式的,所以存在线程安全问题 -->
<!-- 配置HelloServlet -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.yinfu.servlets.HelloServlet</servlet-class> <!-- 配置servlet的初始化参数 -->
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>12345</param-value>
</init-param> <!-- 这个配置是“零或正数”当服务器启动servlet容器加载此web应用的时候就创建servlet实例,并进行初始化,此数值越小优先级越高,
如果没有这个配置或者此配置为“负数”,只有当访问此servlet的时候才会创建实例并初始化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置SecondServlet -->
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>com.yinfu.servlets.SecondServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- servlet映射,次映射是为了运行此servlet中的service内容代码而进行的配置 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!-- '/'代表当前项目的根目录:'http://127.0.0.1:8080/ServletProject/' -->
<url-pattern>/hello</url-pattern>
</servlet-mapping> </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为他的子类)
用法如下:
package com.yinfu.servlets; import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration; import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class HelloServlet implements Servlet { @Override
public void destroy() {
System.out.println("销毁HelloServlet的实例");
} @Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
} @Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
} @Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("将HelloServlet的实例进行初始化"); /**
* 此方法是用来获取web.xml中的init-param中的初始化参数的(局部变量,仅限于此servlet)
* user=root
*/
String user = servletConfig.getInitParameter("user");
System.out.println("user=" + user);
/**
* 此输出会将init-param中的所有初始化参数全部输出
* (Enumeration接口本身不是一个数据结构。但是,对其他数据结构非常重要)
* user:root
* password:12345
*/
Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println(name +":"+ value);
}
/**
* 此getServletName()方法是用来获取web.xml中<servlet-name>HelloServlet</servlet-name>的HelloServlet
* 此方法很少用;
* servletName:HelloServlet
*/
String servletName = servletConfig.getServletName();
System.out.println("servletName:"+servletName);
/**
* Servlet引擎为每个WEB应用程序都创建了一个ServletContext对象,ServletContext对象包含在ServletConfig对象中
* 调用ServletConfig的getServletContext()方法可以返回ServletContext对象的引用
* 而WEB应用程序中的每一个servlet都共用同一个ServletContext对象,ServletContext对象又被称之为application对象
* (应用程序对象)功能:
* ①。获取WEB应用程序的初始化参数
* ②。记录日志
* ③。application域范围的属性
* ④。访问资源文件
* ⑤。获取虚拟路径所映射的本地路劲
* ⑥。WEB应用程序之间的访问
* ⑦。ServletContext对象的其他方法
*/
//获取ServletContext对象
ServletContext context=servletConfig.getServletContext();
//用来获取指定的ServletContext的初始化参数(成员变量,范围为整个WEB程序)
//contextName=com.mysql.jdbc.driver
String contextName = context.getInitParameter("driver");
System.out.println("contextName="+contextName);
//获取所有的ServletContext的初始化参数
//driver:com.mysql.jdbc.driver
//jdbcUrl:jdbc:mysql://apache
Enumeration<String> contextNames = context.getInitParameterNames();
while(contextNames.hasMoreElements()){
String name = contextNames.nextElement();
String contextValue = context.getInitParameter(name);
System.out.println(name+":"+contextValue);
}
//获取WEB应用的某一个文件在服务器上的绝对路径,而不是部署前的路径(文件上传下载的时候会用到)
//E:\File SetUp\develop environment setup\tts9\apache-tomcat-7.0.67\wtpwebapps\ServletProject\picture.png
String realPath=context.getRealPath("picture.png");
System.out.println(realPath);
//获取当前WEB应用的名称(关于页面绝对路径的时候会用到)
//结果:/ServletProject
String contextPath = context.getContextPath();
System.out.println(contextPath);
//获取当前WEB应用的某一文件对应的输入流
//有两种方法呢第一种:classLoader;第二种:ServletContext
//第一种方法classloader
//结果得到输入流:java.io.BufferedInputStream@324f9231
try {
//这里的路径是该文件的类路径
ClassLoader classLoader = getClass().getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
System.out.println(is);
} catch (Exception e) {
e.printStackTrace();
}
//第二种方法ServletContext
//结果得到输入流:java.io.FileInputStream@37591de
try {
//这里的path是相对于当前WEB应用的相对路径,也就是服务器中被编译后的相对路径
InputStream is = context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.out.println(is);
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("HelloServlet的服务逻辑内容");
} public HelloServlet(){
System.out.println("创建HelloServlet的实例");
} }
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大内置对象的更多相关文章
- JSP数据交互——九大内置对象及其方法详解(一)
①既然说到JSP内置对象,那么什么是JSP内置对象呢? 解析:JSP内置对象,就是在编写JSP页面时,不需要做任何声明就可以直接使用的对象. 如下代码片段: <% int[] value ...
- JSP中的9大内置对象四大域与servlet里的三大域
九大内置对象 隐式对象 说明 out 转译后对应JspWriter对象,其内部关联一个PringWriter对象 request 转译后对应HttpServletRequest/ServletRequ ...
- JSP三大指令 /9大内置对象 /Javabean / EL
一个jsp页面中,可以有0~N个指令的定义! 1. page --> 最复杂:<%@page language="java" info="xxx". ...
- JSP中的九大内置对象
JSP九大内置对象 pageContext 存东西 Request 存东西 Response Session 存东西 Application(servletContext) 存东西 config(se ...
- 探索JSP中的 "9大内置对象!"
1.什么是JSP内置对象? jsp内置对象就是Web容器创建的一组对象,我们都知道Tomcat可以看成是一种Web容器,所以我们可以知道所谓的内置对象Tomcat创建的,使用内置对象时可以不适用new ...
- Java Web(五) JSP详解(四大作用域九大内置对象等)
前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...
- 【转载】JSP详解(四大作用域九大内置对象等)
前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...
- web开发(五) JSP详解(四大作用域九大内置对象等)
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6427759.html>,在此仅供学习参考之用. 一.JS ...
- Java Web开发技术教程入门-JSP基本语法和九大内置对象
这两天气温逐渐升高,好想把自己泡在冰块里······ 恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽.......今天阅读到了这本书的第四章-JSP基本语法.经过第一天的阅读,我们明白JSP技术是Java Web开 ...
- JSP九大内置对象与Servlet学习笔记[转]
我们常说的JSP有九大内置对象分别为:request.response.session.out.pagecontext.page.exception.application.config. 我们知道, ...
随机推荐
- CF821E(多次矩阵快速幂)
题意: 冈伦从二维平面上(0,0)走到(k,0),(k<=1e18),每次有三个行动方向:右上一格.右方一格.右下一格,问一共有多少种走的方案 限制:每段x都有一个天花板,一共有n段天花板(n& ...
- ultraiso:usb-hdd+ v2
http://cn.ezbsystems.com/ultraiso/download.htm 普通隐藏:建立一个LBA前置的PBR包含表头的活动分区.高端隐藏:建立一个LBA后置的PBR包含表头的活动 ...
- oracle rac 安装错误整理。
今天是2014.05.26,离别N久的博客今天继续使用. 近期一直忙着离职.入职另外加上家的网一直没有交费,弄的自己開始不那么安稳.学习就是须要一种心情平静.内心稳妥的去进行. 因换笔记本,特须要又一 ...
- linux 查找目录下的文件内容并替换(批量)
2.sed和grep配合 命令:sed -i s/yyyy/xxxx/g `grep yyyy -rl --include="*.txt" ./` 作用:将当前目录(包括子目录)中 ...
- [Analytics] Add Tealium debugger in Chrome
It would be helpful once you can see what information have been tracking inside you web application, ...
- PHP 按位与或 (^ 、&)
今天朋友群里朋友问了下 按位与或的问题.. 按位于主要是对二进制数操作. <?php $a = 1; $b = 2; $c = $a^b; ?> 这里不是单纯的相加关系 十进制 1换算成二 ...
- SLF4J: Failed to load class的问题及解决
今天在做接口测试,一运行测试程序,就跳出这样一个大大的错误: SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. SLF4 ...
- swagger 如何在UI界面加入Authentication token值
接口 2.access_token 值: 3 输入值:bearer+空格+值
- POJ训练计划2299_Ultra-QuickSort(线段树/单点更新)
解题报告 题意: 求逆序数. 思路: 线段树离散化处理. #include <algorithm> #include <iostream> #include <cstri ...
- android 开发中用到的工具-持续更新(码农必看)
1. vim 单文件查看改动利器(一直使用支持各种编码各种文件,各种插件),欢迎下载笔者插件 git clone https://github.com/green130181/vim-conf.git ...



