----------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处] 
文章出处:http://blog.csdn.net/sdksdk0/article/details/51953305
作者:朱培      ID:sdksdk0      邮箱: zhupei@tianfang1314.cn   

--------------------------------------------------------------------------------------------

本文主要介绍servlet的基本使用操作,是一些非常基础的知识,主要掌握servlet作用域、servlet映射、请求转发、ServletConfig配置、ServletContext等的使用,最后以一个简易的文件下载的案例来说明Servlet的应用。

一、简介

Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。servlet是运行在web服务器中的小型java程序,通过HTTP接收和响应web客户端的请求。

Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。因为是对象字节码,可动态地从网络加载,可以说 Servlet 对 Server 就如同 Applet对 Client 一样,但是,由于 Servlet 运行于 Server 中,它们并不需要一个图形用户界面。从这个角度讲,Servlet 也被称为 FacelessObject。

二、编码步骤

1、编码一个类,实现javax.servlet.Servlet接口或者继承javax.servlet.GenericServlet

public class HelloServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException{
res.getOutputStream().write("hello world".getBytes());
}
}

2、配置一个servlet。web.xml中

<!--声明一个servlet -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.tf.servlet.HelloServlet</servlet-class> </servlet> <!-- 给servlet映射一个url地址 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern> </servlet-mapping>

3、把应用部署到Tomcat中,之后才可以看到效果。

三、执行过程

  • 1、通过浏览器输入网址访问tomcat,
  • 2、然后在tomcat中访问该应用
  • 3、找到了这个应用的web.xml()
  • 4、在web.xml中找到叫做/hello的映射
  • 5、在web.xml中找到servlet-name:HelloServlet()
  • 6、找到对应的类HelloServlet.class:先从应用的class目录、应用的lib中的jar包、Tomcat\lib目录中所有的jar包这个顺序进行查找。 实例化servlet对象,接着调用init方法、第一次访问时调用.

  • 7、有Tomcat调用该类的servlet方法

  • 8、浏览器界面响应。

四、生命周期

实例化对象,第一次访问时调用.

init() 一旦初始化完成,该实例就一直保持在Tomcat的内存中,第一次访问时调用.。

getServletInfo() 返回作者、版权等信息。

service() 用户每次请求都会执行。

destroy() 关闭tomcat的时候调用。

加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。

public class ServletDemo2 implements Servlet {

public ServletDemo2(){
System.out.println("调用了servletDemo2的构造方法");
} //初始化
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("调用了init方法");
} //获取servlet配置的方法
@Override
public ServletConfig getServletConfig() {
return null;
}
//返回作者,版权等信息
@Override
public String getServletInfo() {
return null;
}
//服务器方法
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("执行了service方法");
}
//销毁方法
@Override
public void destroy() {
System.out.println("服务器被销毁");
}
}

通过web.xml让servlet在Tomcat加载应用时,就完成实例化和初始化。

<load-on-startup>2</load-on-startup>

GenericServlet和HttpServlet的对比

从大到小:servlet、GenericServlet、HttpServlet myeclipse默认的是继承HttpServlet。这个时候不需要覆盖service方法。继承了doGet、doPost方法。

五、servlet映射细节

映射地址:多个不同的地址可以映射到同一个servlet.

通配符映射:*匹配所有字符串 url-pattern:

  1. .do   以开头,以某个字符串结尾。
  2. /action/*   以前缀开头,以*结尾。
  3. /*   匹配所有。

匹配原则: 绝对匹配: /开头的批评 扩展名结尾的 (优先级高->低).

默认的servlet:一个servlet的url-pattern为一个/,那么这个servlet就是默认的servlet。

线程安全

对于单例对象:多线程就可能出现线程安全问题。 实现SingleThreadModel接口后,控制线程安全问题完全由服务器来决定。

在servlet中尽量不要使用实例变量,应该要使用局部变量。

六、ServletConfig配置

将编码配置放到web.xml中。

  <init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>

读取配置参数的值: ServletConfig

    String value=getServletConfig().getInitParameter("encoding");

七、ServletContext

1、 servletContext的实例就代表当前的javaweb应用。 一个javaweb只有一个servletContext的实例。当前应用中的其他资源(servlet、jsp、html等)共享同一个ServletContext.

2、生命周期 应用被服务器加载时产生ServletContext实例。 生命周期是 从servletContext创建到服务器关闭

3、获得ServletContext的引用

ServletContext  sc=getServletContext();

sc.setAttribute("a", "demo1"); Object value=sc.getAttribute("a");

4、获得web应用的全局参数 在web.xml中配置

<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>

调用:

ServletContext sc=config.getServletContext();
sc.getInitParameter("encoding");

5、servlet请求转发 从demo4转到demo3

ServletContext sc=getServletContext();
RequestDispatcher dispatcher=sc.getRequestDispatcher("/servlet/Demo3");
dispatcher.forward(request, response);

6、读取配置文件

ResourceBundle只适合读取properties文件,只能读取类路径中的配置文件,WEB-INF/class或者jar中的文件:

ResourceBundle rb=ResourceBundle.getBundle("cn.tf.servletContext.c");

ServletContext:String getRealPath(String path), 获取到文件的真实路径,只适合javaweb应用,能够读取其任何位置的任意文件:

ServletContext sc=getServletContext();
String path=sc.getRealPath("/WEB-INF/a.properties");
System.out.println(path); Properties prop=new Properties();
prop.load(new FileInputStream(path));
System.out.println(prop.getProperty("key"));

用类加载器:文件位置要在在类路径中,可以读取任意类型的文件,不适合读取大文件。

ClassLoader cl=Demo5.class.getClassLoader();
InputStream is=cl.getResourceAsStream("cn/tf/servletContext/c.properties"); Properties prop=new Properties();
prop.load(is);
System.out.println(prop.getProperty("key"));

八、文件下载(案例)

1、我们先将图片1放置到项目的WEB-INF目录下
2、我们需要得到文件的真实路径:
ServletContext sc=getServletContext();
String path=sc.getRealPath("/WEB-INF/1.jpg");

3、以流的方式进行读取

OutputStream out=response.getOutputStream();
int len =-1;
byte b[] =new byte[1024]; while((len=in.read(b))!=-1){
out.write(b,0,len);
}

4、告知浏览器去下载这个文件

response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
response.setHeader("Content-Type", "application/octet-stream");

5、关闭流

in.close();
out.close();

完整代码:
//文件下载
public class Demo6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到要下载的文件的真实路径
ServletContext sc=getServletContext(); String path=sc.getRealPath("/WEB-INF/1.jpg"); InputStream in=new FileInputStream(path); //告知浏览器去下载
response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
response.setHeader("Content-Type", "application/octet-stream"); OutputStream out=response.getOutputStream();
int len =-1;
byte b[] =new byte[1024]; while((len=in.read(b))!=-1){
out.write(b,0,len);
}
in.close();
out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request,response);
} }

源码下载:https://github.com/sdksdk0/ServletDemo

Servlet常用操作(基础)的更多相关文章

  1. servlet常用操作

      servlet常用操作 CreateTime--2017年9月7日09:36:43 Author:Marydon 1.获取当前应用程序对象 需要导入: import javax.servlet.S ...

  2. JavaWeb response对象常用操作

      JavaWeb response对象常用操作 CreationTime--2018年7月18日10点42分 Author:Marydon 1.设置响应内容类型 方式一 response.setCo ...

  3. JavaWeb request对象常用操作

      JavaWeb request对象常用操作 CreateTime--2018年6月1日16点47分 Author:Marydon 一.前提 import javax.servlet.http.Ht ...

  4. Docker 基础概念科普 和 常用操作介绍

    Docker 基础概念 Docker是什么?         Docker的思想来自于集装箱,集装箱解决了:在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之 ...

  5. Linux - nginx基础及常用操作

    目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...

  6. InfluxDB从原理到实战 - InfluxDB常用的基础操作

    0x00 基础操作介绍 在本文中将介绍InfluxDB常用的基础操作,帮助读者建立对InfluxDB的感性认识,快速的动手玩起来,持续查询(Continuous Queies).Group by.Se ...

  7. 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  模块初始: Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相 ...

  8. 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作

    目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...

  9. python基础之列表常用操作及知识点小结

    列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是pyth ...

随机推荐

  1. Linux正则表达式总结【网络资源整理】

    正则表达式的分类 1.基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 2.扩展的正则表达式(Extended Regular Expre ...

  2. [LeetCode] 1-bit and 2-bit Characters 一位和两位字符

    We have two special characters. The first character can be represented by one bit 0. The second char ...

  3. burp的dns记录功能

    写个备忘. 先点copy复制url,然后生成的url就能用了. 一关就没了,比较鸡肋些,不适合持久的,适合马上就能见效果的那种.

  4. nginx方向代理

    nginx 的安装 # yum install nginx 新建配置文件 # vi /etc/nginx/conf.d/resume-xyz-8081.conf 配置 upstream resume ...

  5. 搭积木(block)

    [问题描述]小 OY 是一个喜欢搭积木的孩子,他有一天决定向小 C 展示他特别的搭积木技巧.现在一条直线上从左到右有 n 个位置,标号 1..n,第 i 个位置坐标为 x_i.每个位置上都预先叠好了一 ...

  6. bzoj 4545: DQS的trie

    Description DQS的自家阳台上种着一棵颗粒饱满.颜色纯正的trie. DQS的trie非常的奇特,它初始有n0个节点,n0-1条边,每条边上有一个字符.并且,它拥有极强的生长力:某个i时刻 ...

  7. 【luogu3174】【HAOI2009】毛毛虫

    Description 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大. Input 在文本文件 worm.in 中第一行两个整数 N , M ,分 ...

  8. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. ●POJ 3974 Palindrome(Manacher)

    题链: http://poj.org/problem?id=3974 题解: Manacher 求最长回文串长度. 终于会了传说中的马拉车,激动.推荐一个很棒的博客:https://www.61mon ...

  10. HNOI2002 营业额统计(Splay Tree)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意: Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并 ...