java学习笔记—Servlet技术(11)
如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术。那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术。
Servlet技术简介
Servlet技术是SUN提供的一种开发动态网页的核心组件之一。可以方便的开发动态网页。主要用得语言是java,开发者只需要实现相应的接口或者继承相应的类,那么你的java文件就是一个动态的网页。当然好需要一些额外的配置即可。
一个Servlet其实就是一个运行在web server上得一个java程序。
Servlet结构体系
为了方便开发者进行基本的动态网页开发,那么SUN提供了一整套接口和类帮助开发者进行高效的开发。
1 Servlet接口
2 GenericServlet类
GenericServlet实现了Servlet接口的抽象类。
3 HttpServlet类
HttpServlet继承了GenericServlet的抽象类。
Servlet体验
. 建立动态网站的目录结构
. 编写一个动态网页如下HelloServlet.java
package cn.itcast.servlets;
import javax.servlet.*;
import java.io.*;
public class HelloServlet extends GenericServlet
{
public void service(ServletRequest req,ServletResponse res)
throws ServletException,IOException{
// 创建一个需要输出的数据
String data = "hello servlet!";
// 将以上的数据发送给浏览器进行显示
res.getOutputStream().write(data.getBytes());
}
}
. 编译以上的HelloServlet.java
将JavaEE需要的jar包引入到classpath环境变量
set classpath=%tomcat_home%\lib\servlet-api.jar
编译
D:\test>javac -d . HelloServlet.java
. 将编译好的包连同class文件剪切到网站的WEB-INF\classes目录
. 将class文件映射为浏览器需要的URL路径
修改web.xml文件如下
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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-name>helloservlet</servlet-name>
<servlet-class>cn.itcast.servlets.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/helloservlet</url-pattern>
</servlet-mapping>
</web-app>
. 将编写好的网站部署到tomcat的webapps目录
http://localhost:8080/test/helloservlet
运行结果:hello servlet
总结:
- 编译servlet比较繁琐。
- 配置servlet比较繁琐。
2 IDE体验
- 自动编译
- 自动配置
- 集成发布
Servlet、GenericServlet和HttpServlet
1 Servlet接口
Servlet接口主要用于定义初始化servlet、处理用户请求、从web server中移除servlet等生命周期方法。如果开发者需要实现servlet接口,那么推荐继承GenericServlet或HttpServlet。
. The servlet is constructed, then initialized with the init method. 构造函数、init()
. Any calls from clients to the service method are handled. service()
. The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.
举例1:体验生命周期方法。
public class Demo2 extends GenericServlet {
// 创建对象
public Demo2(){
System.out.println("构造 函数");
}
// 初始化
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("init方法");
}
// 处理用户的请求
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("service方法");
}
// 移除方法
public void destroy() {
super.destroy();
System.out.println("destroy方法");
}
}
总结:
. servlet 执行的流程是:创建对象初始化处理用户请求销毁
. 创建对象初始化只是执行一次
. 销毁在服务器关闭的时候进行执行
. 只有用户第一次访问servlet时候如果web server中没有该servlet的对象那么才创建。(懒装载)
. servlet定义的生命周期方法全部由web server自己调用(回调)
. servlet全部是单例
. 一般在实际开发中主要使用的service方法。
2 GenericServlet抽象类
该类是一个通用的servlet类,实现Servlet和ServletConfig接口。如果要实现HTTTP协议,那么请继承HttpServlet类。
该类使得定义servlet变得简单,提供了一些日志、ServletConfig、以及版本的方法。内部声明了一个ServletContext接口类。
该类默认的对Servlet接口的方法进行空实现。但是对于init方法它获取了传递进来的ServletConfig类赋值给了自己定义的ServletConfig成员变量。随后调用了自己的inti()方法。
定义了唯一的一个抽象方法service().
3 HttpServlet抽象类
如果一个网站需要实现HTTP协议的Servlet,那么必须是HttpServlet的子类。那是作为HttpServlet的子类必须重写以下方法中的至少一个:
doGet, if the servlet supports HTTP GET requests 处理用户的GET请求
doPost, for HTTP POST requests 处理用户的POST请求
doPut, for HTTP PUT requests 处理用户的PUT请求
doDelete, for HTTP DELETE requests 处理用户的DELETE请求
init and destroy, to manage resources that are held for the life of the servlet 生命周期方法
getServletInfo, which the servlet uses to provide information about itself 获取servlet信息
我们应该主要的重写doGet和doPost方法。
举例:使用HttpServlet实现处理用户的请求。
public class Demo3 extends HttpServlet {
public Demo3(){
System.out.println("创建对象");
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("初始化");
}
// 处理用户的get请求,地址栏直接回车、a、form默认
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的get请求");
}
// form表单中的method修改为post
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的POST请求");
}
}
思考:HttpServlet继承自GenericServlet实现了Servlet接口,但是自己使用doGet和doPost方法处理用户的请求,那么还需要原来定义的service()?
Tomcat处理用户请求的时候一定执行的Servlet接口中定义的service()
但是用请求的Servlet如果直接继承了HttpServlet那么还是执行Servlet接口的service()方法
该方法中默认调用HttpServlet中自定义的实现了Http协议的service(),该方法中又将请求转发给了相应的doGet或doPost()导致最终处理用户请求的方法是doGet或doPost()。
但是如果开发者手工的重写了Servlet接口的service方法,那么默认不能进行转发。
举例1: 阅读以下程序的运行结果。
public class Demo3 extends HttpServlet {
public Demo3(){
System.out.println("创建对象");
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("初始化");
}
// 处理用户的get请求,地址栏直接回车、a、form默认
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的get请求");
}
// form表单中的method修改为post
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("处理用户的POST请求");
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
super.service(req, res);
System.out.println("service方法");
}
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
super.service(req, resp);
System.out.println("httpservlet service");
}
}
运行结果如下:
创建对象
初始化
处理用户的POST请求
httpservlet service
service方法
java学习笔记—Servlet技术(11)的更多相关文章
- 201521123016 《Java学习笔记》 第11周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...
- Java学习笔记之---Servlet
Java学习笔记之---Servlet (一)如何实现Servlet 1.实现javax.servlet.Servlet接口: 2.继承javax.servlet.GenericServlet类: 3 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- 20155234 2016-2017-2第十周《Java学习笔记》学习总结
20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...
- Java学习笔记之log4j与commons-logging<转>
Java学习笔记之log4j与commons-logging<转> (2011-02-16 11:10:46) 转载▼ 标签: 杂谈 分类: 技术学习之其他 Logger来自log4j自己 ...
- 20145330第十周《Java学习笔记》
20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- 20145330第九周《Java学习笔记》
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...
- java学习笔记05--字符串 .
java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...
随机推荐
- centOs7 忘记root密码
记录:https://blog.csdn.net/niu_hao/article/details/52882895
- 九度oj-1533 最长上升子序列 (LIS)
http://ac.jobdu.com/problem.php?pid=1533 题目描述: 给定一个整型数组, 求这个数组的最长严格递增子序列的长度. 譬如序列1 2 2 4 3 的最长严格递增子序 ...
- 关于Yii2.0的url路径优化问题(配置虚拟路径)
backend/config/main.php 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => fa ...
- PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类
摘要 分型是计算生物学的一个新兴领域,在临床决策和生物医学科学中有着重要的应用. 虽然机器学习技术在许多生物医学应用中显示出巨大的潜力,但它们在分型中的用途尚未完全理解. 在本文中,我们研究了基于聚类 ...
- 字符编码codecs模块(读写文件)
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理.有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码, ...
- .net手动编写Windows服务
1,打开VS,新建一个windows服务程序.项目名称自定义,我这里用的默认名称:Service1 2,打开Service1,按F7查看代码.代码里有三个方法:public Service1().pr ...
- Java程序设计16——Annotatio注释
Annotation是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通过使用Annotation,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充信息.代 ...
- Eclipse下初用lucene
lucene是apache的一个开源项目,一个开放源代码的全文检索引擎工具包. 1. 首先下载lucene,下载地址来自<lucene实战>第2版(页面加载比较忙,等~) http://w ...
- sublime填坑之旅: 格式代码, 缩进缩进
前言:sublime是一款编程神器,轻巧又强大,适用于各种语言.这里介绍下如何快速缩进混乱代码,方便代码阅读. 原料:sublime text 3 1 混乱代码如下: 2 格式菜单选择: 英文: 菜 ...
- 用word2016 写CSDN 博客
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...