Servlet常用操作(基础)
----------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处]
文章出处: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:
- .do 以开头,以某个字符串结尾。
- /action/* 以前缀开头,以*结尾。
- /* 匹配所有。
匹配原则: 绝对匹配: /开头的批评 扩展名结尾的 (优先级高->低).
默认的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"));
八、文件下载(案例)
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常用操作(基础)的更多相关文章
- servlet常用操作
servlet常用操作 CreateTime--2017年9月7日09:36:43 Author:Marydon 1.获取当前应用程序对象 需要导入: import javax.servlet.S ...
- JavaWeb response对象常用操作
JavaWeb response对象常用操作 CreationTime--2018年7月18日10点42分 Author:Marydon 1.设置响应内容类型 方式一 response.setCo ...
- JavaWeb request对象常用操作
JavaWeb request对象常用操作 CreateTime--2018年6月1日16点47分 Author:Marydon 一.前提 import javax.servlet.http.Ht ...
- Docker 基础概念科普 和 常用操作介绍
Docker 基础概念 Docker是什么? Docker的思想来自于集装箱,集装箱解决了:在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之 ...
- Linux - nginx基础及常用操作
目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...
- InfluxDB从原理到实战 - InfluxDB常用的基础操作
0x00 基础操作介绍 在本文中将介绍InfluxDB常用的基础操作,帮助读者建立对InfluxDB的感性认识,快速的动手玩起来,持续查询(Continuous Queies).Group by.Se ...
- 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 模块初始: Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相 ...
- 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作
目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...
- python基础之列表常用操作及知识点小结
列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是pyth ...
随机推荐
- 扩展第二屏幕发生Out Of Range及扩展后耳机没声音解决方案
新年好\(^o^)/~ 拓展屏幕这种事情.其实很简单的.无非就分辨率跟刷新频率.有时候一接好就可以了.有时候怎么也弄不出来.我也是搞了蛮久.昨天突然弄通了.小记一下说不定能帮到同需求人. [设备] 主 ...
- python中创建实例属性
虽然可以通过Person类创建出xiaoming.xiaohong等实例,但是这些实例看上除了地址不同外,没有什么其他不同.在现实世界中,区分xiaoming.xiaohong要依靠他们各自的名字.性 ...
- java之设计模式工厂三兄弟之简单工厂模式
[学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...
- 【PYTHON】递加计数器
计数本:number.txt 1 2 3 4 主程序:计数器 # Author: Stephen Yuan # 递加计算器 import os # 递加计算器 def calc(): file_siz ...
- 确认过眼神,你是喜欢Stream的人
摘要:在学习Node的过程中,Stream流是常用的东东,在了解怎么使用它的同时,我们应该要深入了解它的具体实现.今天的主要带大家来写一写可读流的具体实现,就过来,就过来,上码啦! 码前准备 在写代码 ...
- Python系列之 - python循环语句
前两篇说的是数据类型和数据运算,本篇来讲讲条件语句和循环语句. 1. 条件语句 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执 ...
- C#中string的相关方法
下面的方法一般都有很多重载形式,作为初学者的我先把我用过的记录下来吧...以后用到其他的可以一点点添加: 直接上例子吧.先定义两个字符串str1,str2(不要吐槽命名==) string str1, ...
- Discuz!另一处SSRF无须登陆无须条件
漏洞来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0151179.html 看看poc:http://phpstudy.com/Discuz_ ...
- Maven 项目管理工具基础入门系列(二)
一.前言 在 Maven 项目管理工具基础知识系列(一) 这篇文章中,我们已经初步了解了 Maven,也知道了使用 Maven 作为项目管理工具的好处,特别是已经知道如何快速通过 Maven 构建 W ...
- [SCOI2014]方伯伯的玉米田
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...