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
转载于:https://www.cnblogs.com/xiaowangba/p/6314818.html
Servlet常用操作(基础)相关推荐
- phoenix的元数据一般存在哪里_Phoenix常用操作记录-阿里云开发者社区
Apache Phoenix 常用操作 基础知识 1****.****Phoenix 主要技术点 a.将SQL转化为HBase Scan,将结果封装为JDBC Result Set. b.表的元数据保 ...
- mysql中需要提交的操作_MySQL常用操作及基础知识
原标题:MySQL常用操作及基础知识 1.启动和关闭mysql服务器: service mysql start service mysql stop 2.重启MySQL服务: service mysq ...
- R 语言怎么保存工作目录到当前路径_【R语言基础】01.R语言软件环境搭建及常用操作...
一.R语言简介 R语言是专业的统计分析软件,来自著名数据科学网站(http://www.kdnuggets.com/)发起的一个2019年统计分析和数据挖掘软件使用情况的调查结果: 表明R语言是该领域 ...
- java中数组的返回值是什么类型_java基础学习:数组的常用操作与基础二维数组用法、及基本数据类型和引用数据类型赋值的区别...
一.Arrays jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作.例如快速输出.排序.查找等. 1.数组的常用方法 1.数组以字符串形式的输出,2.sort对数组排序 ...
- excel基础常用操作(2)
excel基础常用操作(2) 一.筛选 1.基本筛选 开始菜单--排序与选项 小漏斗 2.高级筛选 可以有多个筛选条件 可以保留原数据,又可以把结果数据保留下来 位置:数据菜单下--排序与筛选--高级 ...
- 计算机基础知识WORD7,计算机基础知识:Word常用操作(7).doc
计算机基础知识:Word常用操作(七) [导语]在事业单位考试中,计算机专业知识的复习向来是考生复习备考阶段的一大重点,河南人事考试网为计算机基础知识的复习为考生提供知识点梳理,帮助考生备考! 一.打 ...
- Linux - nginx基础及常用操作
目录 Linux - nginx基础及常用操作 Tengine淘宝nginx安装流程 nginx的主配置文件nginx.conf 基于域名的多虚拟主机实战 nginx的访问日志功能 网站的404页面优 ...
- Python基础教程:字符串的常用操作
在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...
- Python os和os.path的基础知识与常用操作
目录 1 os与os.path的关系 2 os和os.path的常用属性和方法 2.1 os模块常用属性 2.2 os模块常用方法 2.3 os.path模块常用方法 2.3.1 路径的常用操作 2. ...
最新文章
- 东大计算机专业自主招生,东大2018年自主招生计划不超过200人 招生专业分为7大类...
- yum命令安装jdk
- Ubuntu14.04安装Torch7笔记
- esxi添加网卡驱动
- HDU6218 2017ACM/ICPC亚洲区沈阳站 Bridge(Set,线段树)
- matlab 指定区域随机游走_了解随机游走模型和移动平均过程(Python)
- 【java】高效压缩位图RoaringBitmap的原理与应用
- 前端防抖和节流合二为一
- 开源 CMS Drupal 修复 XSS 和开放重定向漏洞
- 排序算法之二 插入排序(C++版本)
- iOS面试题06-其他
- NDVI 数据处理,及估算植被覆盖度(一)
- MyBatis注册映射文件(resource、class、package 三者区别)
- Star Way To Heaven 题解
- Linux网络设置(linux相关网络命令大全)
- pm2日志文件过大问题解决
- slub allocator工作原理
- 永磁同步电机自抗扰无位置传感器控制仿真,同时实现自抗扰和基于eso扩张状态观测器的无位置控制仿真
- 【CSA STAR 对标分析】BCR-业务连续性管理与操作恢复
- 为什么使用C#开发软件的公司和程序员都很少?