打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Servlet –基础(上)
HTTP协议
HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器(Browser)和万维网服务器(WebServer)之间互相通信的规则.其主要特点可简单概括如下:
1) 简单快速: 客户端向服务器请求服务时,只需传送请求方法和路径, 因此使得HTTP服务器的程序规模小,通信速度快;
2) 灵活: HTTP允许传输任意类型的数据对象(传输类型由Content-Type控制);
3) 无连接: 无连接的含义是限制每次连接只处理一个请求;
4) 无状态: 无状态是指协议对于事务处理没有记忆能力(如果后续处理需要前面的信息,则必须重传.这样可能导致每次连接传送的数据量增大.但如果在服务器不需要先前信息时它的应答就会非常快快).
HTTP请求
一个HTTP请求通常包含三部分(中间已空行隔开):
请求行:        (方法 /统一资源标识符URI/协议/版本)
请求头:        (Accept/Accept-Language等)
空行:     (CRLF)
请求体:        (携带的数据信息, GET请求没有)
HTTP请求可以使用HTTP标准中定义的所有请求类型, HTTP1.1支持7种请求类型, 但在互联网应用中最为常用的只有GET与POST.
HTTP-GET
GET /WeChat/cc3200/get_status.do HTTP/1.1
Host: aliyun
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
请求头解析
请求头描述
User-Agent浏览器与操作系统信息
Accept当前浏览器可以接收的文档类型
Accept-Language当前浏览器支持的语言
Accept-Encoding当前浏览器支持的压缩格式:服务器会把数据压缩后再发送到网络中传输
Accept-Charset当前浏览器支持的编码
Connection当前浏览器支持的连接方式(keep-alive即保持一段时间的连接,默认为3000ms)
Cookie如果不是第一次访问该网址,可能会在请求中把上次服务器响应的Cookie数据一并发送过去
HTTP-POST
POST /WeChat/cc3200/get_status.do HTTP/1.1
Content-Length: 36
Cache-Control: max-age=0
Origin: http://localhost:8080
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/test/
...
user_name=feiqing&user_password=pass
请求头解析
请求头描述
Referer表明请求来自哪个页面
Content-Typeapplication/x-www-form-urlencoded:表单数据类型,说明会使用URL编码来格式化数据
Content-Length请求体长度
user_name=feiqing&user_password=pass请求体: 请求携带的数据
HTTP响应
一个HTTP响应通常也包含三部分(中间已空行隔开):
响应行:        (协议/状态码/描述)
响应头:        (Server/Content-Length/Set-Cookie等)
空行:     (CRLF)
响应体:        (携带的数据)
HTTP响应是由服务器发送给浏览器的数据,浏览器会根据HTTP响应来解析并显示内容:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 8
Date: Sun, 17 Apr 2016 12:39:11 GMT
...
响应头解析
响应头描述
Server服务器信息
Content-Length响应实体长度
Set-Cookie响应给客户端的Cookie
Expires: -1; / Cache-Control: no-cache; / Pragma: no-cache;设置浏览器不要缓存数据
Refresh自动刷新页面
在HTML文件中可用标签来设置响应头信息:
响应状态码
状态码说明了响应的真正含义:
状态描述
200请求成功
404请求资源没找到
500服务器内部错误
302重定向: 表示服务器要求浏览器重新再发一个请求到服务器指定的一个Location
304缓存未过期(服务器资源未曾修改), 详细可参考理解HTTP/304响应
Tomcat
Tomcat是一个免费开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成. 由于有了Sun的参与和支持, 因此最新的Servlet和Jsp规范总能在Tomcat中得到体现.主页:http://tomcat.apache.org/.
Tomcat目录结构
bin: 存放可执行脚本文件(如startup.bat/startup.sh等)
conf: 存放Tomcat相关配置文件:
1. server.xml: 整个Tomcat运行环境配置(如端口号/虚拟主机等)
2. web.xml: 部署描述符文件(定义了默认JSP/Servlet处理规则,是所有web项
目中WEB-INF/web.xml的父文件)
3. context.xml: 对所有应用的统一配置.
lib:Tomcat类库, 该目录中的jar包所有项目共享.
logs : Tomcat日志目录.
webapps:存放WEB应用,其每个子目录都是一个项目;
work:运行时生成的文件.
server.xml
connectionTimeout='20000'
redirectPort='8443' />
resourceName='UserDatabase'/>
unpackWARs='true' autoDeploy='true'>
prefix='localhost_access_log.' suffix='.txt'
pattern='%h %l %u %t "%r" %s %b' />
元素解析
元素描述
根元素,整个Tomcat的配置信息
服务(在中只能有一个)
连接
引擎,是组件核心
每个元素表示一台虚拟主机.每台虚拟主机都有自己的主机名和项目目录
每个元素表示一个应用.如果应用在的appBase指定的目录下,那么可以不配置元素,如果是外部应用,那么就必须配置
Tomcat配置
1. 配置端口号
编辑%CATALANA_HOME%\conf\server.xml文件中的元素
connectionTimeout='20000'
redirectPort='8443' />
2. 配置外部应用
配置外部应用之后, 项目就可以不用拷贝到webapps目录下,自定义项目存放位置,其配置方式有两种:
1: 修改server.xml
在元素中添加元素
unpackWARs='true' autoDeploy='true'>
prefix='localhost_access_log.' suffix='.txt'
pattern='%h %l %u %t "%r" %s %b' />
如果指定path为空(path=”“), 则默认访问的项目就是/home/www/test, 而不再是webapps下的ROOT.
2: 编辑conf/catalana/localhost目录:
新增test.xml文件
存放到%CATALANA_HOME%/conf/catalana/localhost目录下, 文件名即为应用名.
Servlet
Servlet技术核心就是Servlet接口,所有Servlet实现类都必须实现Servlet接口,Servlet容器(如Tomcat)会把Servlet类加载到内存并生成唯一实例,当有请求到来时调用其方法.
实现Servlet方式有三种:
实现javax.servlet.Servlet接口
继承javax.servlet.GenericServlet类
继承javax.servlet.http.HttpServlet类
Servlet
Servlet接口定义如下
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
方法描述
init在第一次请求该Servlet(默认)或容器启动时, Servlet容器就会调用init(), 且只调用一次
service每次请求Servlet都会调用该方法
destroy销毁Servlet时(卸载应用/关闭容器时), 调用该方法
HelloServlet
/**
* @author jifang.
* @since 2016/4/17 8:32.
*/
public class HelloServlet implements Servlet {
private ServletConfig config;
public void init(ServletConfig config) throws ServletException {
System.out.println('init()...');
this.config = config;
System.out.println('config: ');
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println('service()...');
System.out.println('req: , res: ');
res.getWriter().print('HelloServlet
');
}
public void destroy() {
System.out.println('destroy()...');
}
public ServletConfig getServletConfig() {
return this.config;
}
public String getServletInfo() {
return null;
}
}
web.xml
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_3_0.xsd'
version='3.0'
metadata-complete='true'>
JavaWeb
HelloServlet
com.fq.web.servlet.HelloServlet
HelloServlet
/hello_servlet.do
1. url-pattern
用来指定Servlet的访问路径,必须以/开头.
可以在配置多个, 此时一个Servlet实例就绑定多个URL.
可以在中使用通配符*,可以使一个Servlet绑定一组URL, 但*不能出现在中间位置,也不能只有*通配符, 另外, 通配符只是一种模糊匹配URL的方式,如果存在更具体的,那么会优先选择精确匹配.
2. 配置在容器启动时创建Servlet实例
HelloServlet
com.fq.web.servlet.HelloServlet
1
元素可以让容器在启动时就创建该Servlet实例(调用init()方法),注意元素的值必须是>=0的整数,它代表容器启动时创建Servlet实例的顺序.
GenericService
GenericService抽象类实现了Servlet接口并完成以下工作:
1. 将init()方法中的ServletConfig赋给一个实例变量, 使他可以通过getServletConfig()来获取.
2. 为Servlet接口的所有方法提供默认实现.
3. 提供方法来包装ServletConfig.
Generic部分代码
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable
{
private transient ServletConfig config;
public GenericServlet() { }
public void destroy() {
}
public String getInitParameter(String name) {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString('err.servlet_config_not_initialized'));
}
return sc.getInitParameter(name);
}
public Enumeration getInitParameterNames() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString('err.servlet_config_not_initialized'));
}
return sc.getInitParameterNames();
}
public ServletConfig getServletConfig() {
return config;
}
public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString('err.servlet_config_not_initialized'));
}
return sc.getServletContext();
}
public String getServletInfo() {
return '';
}
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletName() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString('err.servlet_config_not_initialized'));
}
return sc.getServletName();
}
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Servlet
图解利用Eclipse3 Lomboz3 Tomcat开发JSP -- 4.一个Servlet实例 - 天宇流星的专栏
ServletContext和ServletConfig参数访问
ServletContext与ServletConfig的分析
在servlet、filter、Taglib中获取Spring Bean
Tomcat源码分析之 doGet方法(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服