当一个请求到达服务端,服务器怎么处理?

当一个请求到达服务端时,由服务端的引擎来进行分析。它根据工程名找到工程, 然后拿到URL的资源地址和web.XML文件的所有的进行对比,和哪一个对比上就找到了具体的servlet。然后就去创建servlet对象,进行处理。


找到servlet,创建servlet对象后,他的生命周期?

当servlet引擎找到具体的servlet类后,就开始调用它的无参构造器,来创建这样一个对象,创建这个对象之后,调用它的init方法(带参的init()方法,init()方法只会调用一次),之后立刻调用service方法进行处理。处理完之后就一直等待下一个请求的到来。当我们停止应用或关掉服务器的时候,调用destroy方法。servlet实体创建后一直存在于服务器内存中,直到服务器关闭或者应用停止。(不论有多少人在访问)


url-parttern写法(两种)

  • 1.以/开头:/代表的是工程路径(/工程名称) 必须要加/
  • 2.以开头:必须要加后缀名(后缀名任意) 后缀名不能用
  • 3.如果只配置一个/:此Servlet就是一个默认的servlet,用来处理所有的匹配不上的请求

    注意:/*.后缀名 此种情况不允许

    /* 表示任意

    优先级:精确匹配 > 以/开头的匹配 > 以*号开头的匹配


ServletConfig对象的应用

//拿到servletConfig对象
SercletConfig sc = this.getServletConfig();
//拿取配置的单个信息
String name = sc.getInitParameter("name");
System.out.println(name); //拿取配置的多个信息
Enumeration<String> enu = sc.getInitParameterNames;
while(enu.hasMoreElements()){
String name = enu.nextElement(); }

ServletContext的用处

  1. ServletContext对象作为域对象使用

    //获取全局对象
    ServletContext sc = this.getServletContext(); //存储数据
    sc.setAttribute("name","张海迪"); //从sc中拿取数据,在另一个Servlet中也可以获取,因为一个程序只有一个Servlet对象
    String name = (String)sc.getAttribute("name");
  2. 可以直接在web.xml中配置,然后获取

    //在web.xml中配置
    <context-param>
    <param-name>name</param-name>
    <param-value>张海迪</param-value>
    </context-param>
    <context-param>
    <param-name>sex</param-name>
    <param-value>female</param-value>
    </context-param>

    //拿到全局对象
    ServletContext sc = this.getServletContext();
    //获取单个配置参数
    String name = sc.getInitParameter("name"); //拿取多个配置参数的值
    Enumeration<String> enu = sc.getInitParameterNames();
    while(enu.hasMoreElements()){
    String name = enu.nextElement();
    System.out.println(name + ":" + sc.getInitParameter(name))
    }
  3. 全局对象的请求转发

    转发到另一个页面,另一个页面的request就和当前Servlet中的一样了。

    //拿到全局对象
    ServletContext sc = this.getServletContext(); request.setAttribute("name","Tryking"); //拿到请求转发器
    RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContext2");
    //转发过去
    rd.forward(request,response);
  4. 获取资源文件

    获取资源文件有三种方式:

    1. 采用ServletContext对象获取
    2. 采用ResourceBundle类来获取
    3. 采用类加载器获取


    • 第一种方式:优点:任意文件,任意路径

      缺点:必须有web环境
    • 第二种方式:优点:简单方便

      缺点:1.只能拿取Properties文件

      2.只能拿取非web环境下的资源
    • 第三种方式:优点:任意文件,任意路径

      缺点:编写稍微麻烦

//采用ServletContext对象获取
public void test1(){
//拿到全局对象
ServletContext sc = this.getServletContext(); //获取p.properties文件的路径
//当资源文件在src目录下时
String path = sc.getRealPath("/WEB-INF/classes/p.properties");
//当资源文件在工程目录下
//String path = sc.getRealPath("p.properties");
//创建一个Properties对象
Properties pro = new Properties();
//加载文件
pro.load(new FileReader(path));
//读取Properties中的值
System.out.println(pro.get("k"));
}

//采用ResourceBundle类来获取(不能拿取web的东西)
public void test2(){
//拿取ResourceBundle对象(专门用来获取Properties文件的信息)
//当p.proterties在src目录下(属于java的东西)
ResourceBundle rb = ResourceBundle.getBundle("p");
//当p.proterties在工程目录下(也就是web方面的东西)
//拿不到
//拿取文件中的内容
System.out.println(rb.getString("k"));
}

//采用类加载器获取:默认路径是src,对应到web环境就是classes
//类加载器:将字节码文件(.class文件)加载到内存运行
public void test3(){
//获取类加载器的方式
/*
* 1.通过类名
* ServletContext.class.getClassLoader()
* 2.通过对象
* this.getClass().getClassLoader()
* 3.Class.forName()获取
* Class.forName("ServletContext").getClassLoader()
* * / //获取类加载器
//如果文件在WebRoot下,路径应该是:"../../p.properties"
InputStream in = this.getClass().getClassLoader().getResourceAsStream("com/test/p.properties");
//创建Properties对象
Properties pos = new Properties();
pro.load(in);
//拿取文件的数据
System.out.println(pro.getProperty("k"));
}

中文乱码问题

//采用字节流输出数据
String s = "末日没有进行曲";
//不会出现乱码
response.getOutputStream().write(s.getBytes());
//会出现乱码
response.getOutputStream().write(s.getBytes("utf-8"));

//解决:
//1.让用户在浏览器中选择解码
//2.通知浏览器采用某种编码进行
response.setHeader("Content-Type","text/html;charset=UTF-8");
//3.让服务器的编码用一种编码,通知浏览器的解码
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type","text/html;charset=UTF-8");
//4.(推荐)也可解决字符流的中文问题
//此句代码做了两件事情:1.设定服务器将数据编码时用的码表
// 2.通知浏览器解码用的码表
response.setContentType("text/html;charset=utf-8");
response.getOutputStream().write(s.getBytes("UTF-8"));

Web开发之Servlet的更多相关文章

  1. web开发之Servlet 一

    因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果 ...

  2. Java Web开发之Servlet、JSP基础

    有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发 ...

  3. web开发之Servlet 三

    昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig  ServletContext 我们可以看到,与顶层Servlet主动 ...

  4. web开发之Servlet 二

    在上一篇文章中,我们演示也证明了Servlet 是一种动态web资源开发的技术,即我可以在浏览器中输入URL,然后就可以在浏览器中看到我们编写的Servlet资源. 那当我们在浏览器上一起一个HTTP ...

  5. Java Web开发之Servlet获取ckeditor内容

    js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/cked ...

  6. Web开发之Tomcat&Servlet

    <!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...

  7. Vim下的Web开发之html,CSS,javascript插件

    Vim下的Web开发之html,CSS,javascript插件   HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...

  8. 移动web开发之rem适配布局

    移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...

  9. JavaWeb开发之Servlet

    1. Servlet有关概念和前置知识 1.1 什么是动态网页 如果浏览器在不同时刻或不同条件下访问web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态页面. 动态网 ...

随机推荐

  1. 保留重复项(Power Query 之 M 语言)

    数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...

  2. 共享资源库(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 既然要共享资源库,那就得先建一个可供共享的资源库文件,好吧,说得这么高大上,其实就是一个里面只有资源数据的mpp项目文件, ...

  3. 通过idea创建Maven项目整合Spring+spring mvc+mybatis

    创建项目 File→new→project             然后就不断next直到项目面板出来 设置文件夹         注意:这里我个人习惯,在java下还建了ssm文件夹,然后再cont ...

  4. JavaFx Tooltip悬浮提示使用及自定义

    原文:JavaFx Tooltip悬浮提示使用及自定义 | Stars-One的杂货小窝 本篇是基于TornadoFx框架对Tooltip组件进行讲解,使用Kotlin语言,和传统Java使用有所区别 ...

  5. C++ 智能指针(shared_ptr/weak_ptr)原理分析

    其主要的类关系如下所示(省略相关的类模板参数): 图1 从上面的类图可以清楚的看出shared_ptr内部含有一个指向被管理对象(managed object)T的指针以及一个__shared_cou ...

  6. ACwing1208. 翻硬币

    题目: 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果 ...

  7. nim_duilib(5)之option

    introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 xml文件添加代码 基于上一篇, 继续向basic.xml中添加下面关于Option的代码. xml完整源码在 ...

  8. 【LeetCode】990. Satisfiability of Equality Equations 解题报告(C++ & python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 并查集 日期 题目地址:https://le ...

  9. 【LeetCode】373. Find K Pairs with Smallest Sums 解题报告(Python)

    [LeetCode]373. Find K Pairs with Smallest Sums 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/p ...

  10. Docker 与 K8S学习笔记(六)—— 容器的资源限制

    我们在启动Docker容器时,默认情况下容器所使用的资源是没有限制的,这样就会存在部分特别耗资源的容器会占用大量系统资源,从而导致其他容器甚至整个服务器性能降低,为此,Docker提供了一系列参数方便 ...