4.Servlet(动态web资源)
Servlet (动态web资源)
开发一个动态web资源(即开发一个Java程序向浏览器输出数据) 需完成以下两个步骤
1.编写一个Java类,实现servelet接口
2.把开发好的Java类部署到web服务器中
servlet入门(用servlet 在一个网页中显示 helloworld)(动态)(不使用IDE的情况下)
1.在tomcat中新建一个web应用,然后在web应用中新建一个 web-inf/classes目录
2.在classes目录中新建一个FirstServlet
public class FirstServlet extends GenericServlet {
public void service(ServletRequest req,ServletResponse res) throws ServletException,java.io.IOException {
OutputStream out = res.getOutputStream(); //字节流
out.write("hello world!!".getBytes()); //"hello world!!" 是字符 需变成字节
}
}
3.set classpath=%classpath% .............servlet.jar 编译servlet
(因为servlet属于j2ee,不是j2se,所以,需要配置一下classpath)(在dos命令行中)
4.在web-inf目录中新建一个web.xml文件,配置servlet对外访问路径
5.启动tomcat 访问
Servlet调用过程:
1.连上web服务器
2.发送http请求
3.解析出想访问的主机名
4.解析出想访问的web应用
5.解析出想访问的web资源
6.第一次创建servlet实例对象
7.调用servlet对象的init方法完成初始化
8.创建代表请求的request和代表响应的response调用servlet的service方法响应客户端请求
9.service方法执行,向代表客户端响应的response对象写入了向客户机输出的数据
10.service方法返回
11.从response中取出数据,构建出HTTP响应,回写给客户机
12.回写HTTP响应
13.浏览器解析HTTP响应 显示数据
注:HttpServlet在实现了Servlet接口时,覆写了service方法,当继承了HttpServlet后 就不需要再写service方法,只需要写doGet 或者 doPost方法里面处理
Servlet的小细节:
1.同一个Servlet可以被映射到多个URL上,即可以写多个<servlet-mapping>,也可以使用*通配符,但是只能有两种固定格式:
一种格式是: " *.扩展名 ", 另外一种格式是(/*)
2.web.xml文件的更改,不需要重新发布工程,会自动更新
3.使用 * 通配符可能出现地址冲突的问题,都匹配某个请求的情况:遵循: 1.选长得最像的响应 2.通配符在前优先级最低
4.Servlet不能独立运行,它的运行完全由Servlet引擎(web服务器用来调Servlet的java程序)来控制和调度
5./*针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,
也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web容器退出(Tomcat关闭),servlet实例对象才会销毁*/
6.在servlet的整个生命周期内,这个servlet的init方法只被调用一次,而对一个servlet的每次访问请求都导致servlet引擎调用一次service方法,
对于每次访问请求,servlet请求都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,
然后将这两个对象作为参数传递给它调用的servlet的service()方法,service方法再根据请求方式分别调用doXXX()方法
7.如果在<servlet>元素中配置了一个<load-on-startup>(里面可以写正整数,数字越小,优先级越高)元素,
那么WEB应用程序在启动时,就会装载并创建servlet的实例对象,以及调用servlet实例对象的init()方法 用途:在特定时刻,为web应用创建必要的数据库表和数据
8.如果某个servlet的映射路径仅仅为一个 (/),那么这个servlet就成为当前web应用程序的缺省servlet 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,
它们的访问请求都交给缺省servlet处理,也就是说,缺省servlet用于处理所有其他servlet都不处理的访问请求
在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个servlet设置为可缺省servlet
由上: /*当访问tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet*/
9.servlet的线程安全问题:service方法如果操作共享资源,则有可能出现线程安全问题
如果某个servlet实现了SingleThreadModel接口(标记接口,无方法),那么servlet引擎将以单线程模式来调用其service方法
(如果多个线程同时访问某个资源,则产生对应的多个servlet实例对象,并发的每个线程分别调用一个独立的servlet实例对象)
实现SingleThreadModel接口并不能真正解决servlet的线程安全问题,因为servlet引擎会创建多个servlet实例对象,
而 /*真正意义上解决多线程安全问题是指一个servlet实例对象被多个线程同时调用的问题*/ 故 SingleThreadModel接口(过时的)
web服务器在调用servlet的时候,会传递给servlet很多对象:前面讲到了ServletRequest , ServletSponse 还有一些其他的对象:如ServletConfig ServletContext session cookie 等
1./*ServletConfig对象(用于封装servlet的配置信息)*/
在Servlet的配置文件中,可以使用一个或者多个<init-param>标签为servlet配置一些初始化参数
在servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,
将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息
该对象的作用: 1.获得字符集编码 2.获得数据库连接信息 3.获得配置文件,查看struts案例的web.xml文件
2./*ServletContext对象 (代表当前web应用)*/
WEB容器在启动时,它会为每个web应用程序都创建出一个对应的ServletContext对象
ServletConfig对象中维护了ServletContext对象的引用(即可以通过ServletConfig.getServletContext方法获得 (因为继承了HttpServlet也可以直接this.getServletContext ))
ServletContext方法的应用
1.多个Servlet通过ServletContext对象实现数据共享 ServletContext对象通常被称之为context/*域*/对象 (ServletContext域这个容器的作用范围:应用程序范围)
2.获取web应用的初始化参数 <context-param>标签定义的参数为web应用的初始化参数 (会自动封装到ServletContext中)
(ServletContext出生:web服务器启动(为每个web应用配一个ServletContext),死亡:web服务器关闭,或者web应用被删除)
3.实现Servlet的转发(与重定向有所区别:Servlet的转发:别人找我借钱,我帮他向别人借 重定向:别人找我借钱,我让他找别人借)
Servlet不适合用作数据的输出(网页要弄美观很麻烦),所以需要转给JSP(JSP可以看作一种特殊的Html,里面可以写java代码的Html)(用来专门显示数据)
4.ServletContext读取web应用中的资源文件
5.web应用中的普通Java程序如何读取资源文件 (servlet文件通过ServletContext,非servlet文件通过类装载器)
4.Servlet(动态web资源)的更多相关文章
- JavaWeb学习笔记——开发动态WEB资源(一)Java程序向浏览器输出数据
开发一个动态web资源,即开发一个Java程序向浏览器输出数据,需要完成以下2个步骤: 1.编写一个Java类,实现Servlet接口 开发一个动态web资源必须实现javax.servlet.Ser ...
- JavaWeb学习笔记——开发动态WEB资源(五)servlet身份验证
本工程的功能是实现Javaweb的servlet身份验证 一下是login.html文件中的代码 <!DOCTYPE html> <html> <head> < ...
- JavaWeb学习笔记——开发动态WEB资源(六)ServletConfig和ServletContext
1.只有在第一次请求服务器产生实例的时候才会调用init()方法,有一种办法能在服务器一启动的时候就加载init()方法. 即服务器启动即加载Servlet,且按数字大小顺序实例化Servlet. 方 ...
- JavaWeb学习笔记——开发动态WEB资源(四)打印当前使用的是get方法
该工程的名称是testhttp,功能是在页面中表格打印浏览过程中的相关头信息. 新建一个工程,然后在这个工程里面新建一个servlet,这样便可以省去编写web.xml的过程 以下是TestHttpS ...
- JavaWeb学习笔记——开发动态WEB资源(三)显示当前时间
该工程的功能是实现在页面中显示当前的时间 以下的代码是HelloServlet.java中的代码 package helloapp2; import java.io.IOException; impo ...
- JavaWeb学习笔记——开发动态WEB资源(二)HelloWord
该工程的功能是在页面上输出一段话 首先在src里面新建一个class,在interface里面添加javax.servlet.Servlet 以下是HelloServlet.java中的代码: pac ...
- JavaWeb学习笔记——开发动态WEB资源(八)cookies和httpsession
会话: cookies: (1)cookies是WEB服务器发送到浏览器的简短文本信息 (2)cookies可以禁用 httpsession: 一次会话是从你打开浏览器开始到你关闭浏览器结束 提供一种 ...
- JavaWeb学习笔记——开发动态WEB资源(七)bookapp
该工程的功能是实现一个bookapp 1.开发注册页面,注册使用properties文件,存储在classpath跟路径 2.注册成功跳转到登录页面 3.输入用户名密码登录,登录成功跳转到book显示 ...
- JavaWeb-入门第一课-1.静态web动态web 2.web服务器 3.下载和安装Tomcat-web服务器
文章来源:http://www.cnblogs.com/xdp-gacl/p/3729033.html 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思 静态web资源(如html ...
随机推荐
- 10 Flutter仿京东商城项目 商品分类跳转到商品列表传值 商品列表页面布局
pages下面新建: ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper ...
- python中关于with以及contextlib的使用
一般在coding时,经常使用with来打开文件进行文件处理,然后无需执行close方法进行文件关闭. with open('test.py','r' as f: print(f.readline() ...
- Elasticsearch删除数据操作,你必须知道的一些坑
前两天有同事打电话问我,说ES删除数据有没有什么坑? 我当时就问,是删索引还是删索引里的数据?她回答说是删数据,我说查出这些数据直接删除就好了,没有什么坑... 后来想想,关于ES数据的删除,之前确实 ...
- 微信小程序 左右分类列表
分类界面,左边是一级目录,右边是一级目录对应的二级目录,根据这个需求,我们数据设计的结构一定是数组嵌套数组,第一个数组包含一级目录数据,嵌套的数组包含的是二级目录的数据. wxml代码: <vi ...
- 最新 米哈游java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.米哈游等10家互联网公司的校招Offer,因为某些自身原因最终选择了米哈游.6.7月主要是做系统复习.项目复盘.LeetCo ...
- Charles系列三:Charles打断点(包含修改请求,修改返回的内容),模拟慢速网络(弱网测试),域名映射,过滤请求,接口调试,打压测试
一:Charles断点的使用(包含修改请求,修改返回的数据) 设置断点来修改请求和返回的数据,在开发过程中可以模拟多种响应.步骤如下: 1.添加断点方法有两种: 方法1:找到Charles中菜单项Pr ...
- Information retrieval (IR class1)
1. 什么是IR? IR与数据库的区别? 答:数据库是检索结构化的数据,例如关系数据库:而信息检索是检索非结构化/半结构化的数据,例如:一系列的文本.信息检索是属于NLP(自然语言处理)里面最实用的一 ...
- shell备份脚本
#!/bin/bash #不存在的变量终止脚本执行 set -o nounset #执行出错终止脚本执行 set -o errexit #递归列出文件的绝对路径并执行压缩 delDir=`date - ...
- lg 1478
好多天没碰代码了,感觉忘得差不多了,没有学习感觉罪恶深重,从今天起开始补题啊啊! 简单零一背包,套模板就行. #include<bits/stdc++.h> using namespace ...
- PHP学习之PHP的语法糖
PHP的语法糖 计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用. 常见的PHP的语法糖 echo(),print(),die(),isset(),unset(),i ...