Java Web之路(一)Servlet
序言
执行过程
Servlet 生命周期、工作原理:http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html
Servlet的生命周期
Servlet的生命周期是由Servlet的容器来控制的,它可以分为3个阶段;初始化,运行,销毁。
初始化阶段:
1).Servlet容器加载servlet类,把servlet类的.class文件中的数据读到内存中。
2).然后Servlet容器创建一个ServletConfig对象。ServletConfig对象包含了Servlet的初始化配置信息。
3).Servlet容器创建一个servlet对象。
4).Servlet容器调用servlet对象的init方法进行初始化。
运行阶段:
当servlet容器接收到一个请求时,servlet容器会针对这个请求创建servletRequest和servletResponse对象。
然后调用service方法。并把这两个参数传递给service方法。Service方法通过servletRequest对象获得请求的信息。并处理该请求。再通过servletResponse对象生成这个请求的响应结果。然后销毁servletRequest和servletResponse对象。我们不管这个请求是post提交的还是get提交的,最终这个请求都会由service方法来处理。
销毁阶段:
当Web应用被终止时,servlet容器会先调用servlet对象的destrory方法,然后再销毁servlet对象,同时也会销毁与servlet对象相关联的servletConfig对象。我们可以在destroy方法的实现中,释放servlet所占用的资源,如关闭数据库连接,关闭文件输入输出流等。
在这里该注意的地方:
在servlet生命周期中,servlet的初始化和和销毁阶段只会发生一次,而service方法执行的次数则取决于servlet被客户端访问的次数。
3.Servlet的三种创建方式
1)实现javax.servlet.Servlet接口
- package com.mf.servlet;
- import java.io.IOException;
- import javax.servlet.Servlet;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- public class ServletDemo1 implements Servlet{
- //Servlet生命周期的方法
- //在servlet第一次被访问时调用
- //实例化
- public ServletDemo1(){
- System.out.println("***********ServletDemo1执行了*********");
- }
- //Servlet生命周期的方法
- //在servlet第一次被访问时调用
- //初始化
- public void init(ServletConfig arg0) throws ServletException {
- System.out.println("***********init执行了*********");
- }
- //Servlet生命周期的方法
- //服务
- //每次访问时都会被调用
- public void service(ServletRequest arg0, ServletResponse arg1)
- throws ServletException, IOException {
- //System.out.println("hello servlet");
- System.out.println("***********service执行了*********");
- }
- //Servlet生命周期的方法
- //销毁
- public void destroy() {
- System.out.println("***********destroy执行了*********");
- }
- public ServletConfig getServletConfig() {
- // TODO Auto-generated method stub
- return null;
- }
- public String getServletInfo() {
- // TODO Auto-generated method stub
- return null;
- }
- }
2)继承javax.servet.GenericServlet类(适配器模式)
- package com.mf.servlet;
- import java.io.IOException;
- import javax.servlet.GenericServlet;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- public class ServletDemo2 extends GenericServlet {
- @Override
- public void service(ServletRequest arg0, ServletResponse arg1)
- throws ServletException, IOException {
- System.out.println("ok");
- }
- }
3)继承javax.servlet.http.HttpServlet类(模板方法设计模式)
- package com.mf.servlet;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ServletDemo3 extends HttpServlet{
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- System.out.println("*******doGet *******");
- System.out.println(req.getRemoteAddr());
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- System.out.println("**********doPost**********");
- }
- }
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" version="2.5">
- <!-- 创建一个Servlet实例 -->
- <servlet>
- <servlet-name>servletDemo1</servlet-name>
- <servlet-class>com.mf.servlet.ServletDemo1</servlet-class>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <!-- 给Servlet提供(映射)一个可供客户端访问的URI -->
- <servlet-mapping>
- <servlet-name>servletDemo1</servlet-name>
- <url-pattern>/demo1</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>servletDemo2</servlet-name>
- <servlet-class>com.mf.servlet.ServletDemo2</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>servletDemo2</servlet-name>
- <url-pattern>/demo2</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>servletDemo3</servlet-name>
- <servlet-class>com.mf.servlet.ServletDemo3</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>servletDemo3</servlet-name>
- <url-pattern>/demo3</url-pattern>
- </servlet-mapping>
- </web-app>
servet映射细节
url-pattern: *.do 以*.字符串的请求都可以访问 注:不要加/
url-pattern: /* 任意字符串都可以访问
url-pattern: /action/* 以/action开头的请求都可以访问
匹配规则:
优先级:从高到低
绝对匹配--> /开头匹配 --> 扩展名方式匹配
如果url-pattern的值是/,表示执行默认映射。所有资源都是servlet
Servlet的线程安全
解决线程安全问题的最佳办法,不要写全局变量,而写局部变量。
Servlet获取配置信息
- package com.mf.servlet;
- import java.io.IOException;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ServletConfigDemo1 extends HttpServlet {
- /*private ServletConfig config;
- public void init(ServletConfig config) throws ServletException {
- this.config = config;
- }
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- /*String encoding = config.getInitParameter("encoding");//获得配置文件中的信息的
- System.out.println(encoding);*/
- //第二种方式 记得屏蔽最上面代码
- /*System.out.println("--------");
- String encoding = this.getServletConfig().getInitParameter("encoding");
- System.out.println(encoding);*/
- //第三种方式 记得屏蔽最上面的代码
- /*String encoding = super.getInitParameter("encoding");
- System.out.println(encoding);*/
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
ServletContext
ServletContext: 代表的是整个应用。一个应用只有一个ServletContext对象。单实例。
作用:
域对象:在一定范围内(当前应用),使多个Servlet共享数据。
常用方法:
void setAttribute(String name,object value);//向ServletContext对象的map中添加数据
Object getAttribute(String name);//从ServletContext对象的map中取数据
void rmoveAttribute(String name);//根据name去移除数据
- //通过调用GenericServlet的getServletContext方法得到ServletContext对象
- ServletContext application = this.getServletContext();
- //向ServletContext添加一个键值对
- application.setAttribute("name", "tom");
- System.out.println(application.getClass().getName());
- String name = (String) this.getServletContext().getAttribute("name");
- if(name==null){
- System.out.println("你不能直接访问这个类");
- }
- System.out.println(name);
获取全局配置信息
- <!-- 配置当前应用的全局信息 -->
- <context-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </context-param>
- String encoding = this.getServletContext().getInitParameter("encoding");
- System.out.println(encoding);
获取资源路径
- package com.mf.ServletContext;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.util.Properties;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ServletDemo4 extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //test1();
- //test2();
- test3();
- }
- //获取/WEB-INF/classes/b.properties文件
- private void test3() throws IOException, FileNotFoundException {
- String path = this.getServletContext().getRealPath("/WEB-INF/classes/com/mf/servlet/c.properties");
- Properties pro = new Properties();
- pro.load(new FileInputStream(path));
- System.out.println(pro.get("key"));
- }
- //获取/WEB-INF/classes/b.properties文件
- private void test2() throws IOException, FileNotFoundException {
- String path = this.getServletContext().getRealPath("/WEB-INF/classes/b.properties");
- Properties pro = new Properties();
- pro.load(new FileInputStream(path));
- System.out.println(pro.get("key"));
- }
- //获取WEB-INF下的a.properties文件
- private void test1() throws IOException, FileNotFoundException {
- String path = this.getServletContext().getRealPath("/WEB-INF/a.properties");//参数一定要以/开头
- //创建一个Properties
- Properties pro = new Properties();
- pro.load(new FileInputStream(path));
- System.out.println(pro.getProperty("key"));
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
实现Servlet的转发
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- System.out.println("我要办事");
- System.out.println("你的事我办不了,我可以帮你找人办");
- ServletContext application = this.getServletContext();
- /*RequestDispatcher rd = application.getRequestDispatcher("/servlet/demo6");
- rd.forward(request, response);*/
- //将请求向下传递
- application.getRequestDispatcher("/servlet/demo6").forward(request, response);
- System.out.println("事办完了");
- }
Servlet相关对象
Java Web之路(一)Servlet的更多相关文章
- SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
- Java web每天学之Servlet工作原理详情解析
上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...
- Java Web每天学之Servlet的原理解析
Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...
- 【Java Web开发学习】Servlet、Filter、Listener
[Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...
- 初学 Java Web 开发,从 Servlet 开发
1. 基本要求:Java 编程基础 有良好的 Java 语言编程基础,这是必须的,在讨论 Web 开发技术时提了一个 Java 编程基础的问题会被鄙视的. 2. 环境准备 (Eclipse + Tom ...
- 初学Java Web(3)——第一个Servlet
这学期 Java Web 课程的第一节课就简短复习了一下 Java 的一些基础知识,所以觉得 Java 的基础知识还是很重要的,但当我想要去写一篇 Java 回顾的文章的时候发现很难,因为坑实在太多了 ...
- java web学习总结(五) -------------------servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- java web学习总结(六) -------------------servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- java web 学习六(servlet开发2)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
随机推荐
- 【转帖】互联网加密及OpenSSL介绍和简单使用
转帖:https://mritd.me/2016/07/02/%E4%BA%92%E8%81%94%E7%BD%91%E5%8A%A0%E5%AF%86%E5%8F%8AOpenSSL%E4%BB%8 ...
- [转载] Oracle在windows下面的自动备份以及删除今天的脚本..
@echo off echo ================================================ echo Windows环境下Oracle数据库的自动备份脚本 echo ...
- React 表单受控组件
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 日志那点事儿——slf4j源码剖析
前言: 说到日志,大多人都没空去研究,顶多知道用logger.info或者warn打打消息.那么commons-logging,slf4j,logback,log4j,logging又是什么关系呢?其 ...
- 14.5 富文本编辑【JavaScript高级程序设计第三版】
富文本编辑,又称为WYSIWYG(What You See Is What You Get,所见即所得).在网页中编辑富文本内容,是人们对Web 应用程序最大的期待之一.虽然也没有规范,但在IE 最早 ...
- (C++)关于i++和i++的左值、右值问题
1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值 ...
- ACdream1187-Rational Number Tree-模拟/找规律
找到规律模拟就可以了,用DFS模拟很简洁,用循环模拟比较直观(大概吧) 注意输入输出用%llu,1ULL<<64=0!被这几个小问题卡了好久 #include <cstdio> ...
- 睡前小dp-poj3254-状压dp入门
http://poj.org/problem?id=3254 从这里学的 http://blog.csdn.net/accry/article/details/6607703 状压dp的入门题.一片N ...
- python成长之路八 -- 内置函数
1,python内置函数 内置函数 abs() dict() help() min() setattr() all() dir() hex() next() slice() a ...
- Harmonic Number LightOJ - 1234 (分段打表)
题意: 求调和级数,但n很大啦.. 解析: 分段打表 每间隔50存储一个数,在计算时 只需要找到离输入的n最近的那个数 以它为起点 开始计算即可 emm...补充一下调和级数的运算公式 r为常 ...