JavaWeb(五)Servlet-2

1、HTTP简介

WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。

HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。

HTTP协议的版本 HTTP/1.0、HTTP/1.1、HTTP-NG、HTTP/2.0。

2、HTTP 的会话方式

四个步骤:

浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。

浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。

3、HTTP请求消息和响应消息

请求消息和响应消息的结构都是一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

响应消息的实体内容就是网页文件的内容,也就是在浏览器中使用查看源文件的方式所看到的内容。

一个使用GET方式的请求消息中不能包含实体内容,只有使用POST、PUT和DELETE方式的请求消息中才可以包含实体内容。

4、使用GET和POST方式传递参数

4.1 使用GET方式传递参数

在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。 如果网页中的表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。

使用GET请求方式给WEB服务器传递参数的格式:

http://localhost:8080/JavaWeb01/loginServlet?user=188xxxx6527&password=257257

使用GET方式传送的数据量一般限制在1KB以下。

4.2 使用POST方式传递参数

POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。

5、ServletRequest

Servlet API 中定义的 ServletRequest 接口类用于封装请求消息。

HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息。

在 service() 方法内部调用 HttpServletRequest 对象的各种方法来获取请求消息。

(1)获取请求行的相关信息

HTTP请求消息的请求行包括请求方式、资源路径和HTTP协议版本:

getMethod:返回HTTP请求消息中的请求方式。

getRequestURI:返回请求行中的资源名部分。

getQueryString :返回请求行中的参数部分。

getProtocol:返回请求行中的协议名和版本。

getContextPath:返回请求资源所属于的WEB应用程序的路径。

getPathInfo:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

getPathTranslated:返回URL中的额外路径信息所对应的资源的真实路径。

getServletPath方法:Servlet的名称或Servlet所映射的路径。

(2)获取网络连接信息

getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。 (*)

getRemoteHost方法返回发出请求的客户机的完整主机名,即“pc1.atguigu.com”这种格式。

getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。

getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。

getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。

getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。

getServerName方法返回当前请求所指向的主机名。

getServerPort方法返回当前请求所连接的服务器端口号。

getScheme方法返回请求的协议名,例如http、https或ftp。

getRequestURL方法返回客户端发出请求时的完整URL。

(3)获取请求头信息

getHeader方法

getHeaders方法

getHeaderNames方法

getIntHeader方法

getDateHeader方法

getContentType方法

getContentLength方法

getCharacterEncoding方法

(4)获取请求参数

getParameter方法

getParameterValues方法

getParameterNames方法

getParameterMap方法

(5)请求域属性

存储在ServletRequest对象中的对象称之为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据。

与请求域属性相关的方法:

setAttribute方法

getAttribute方法 

removeAttribute方法

getAttributeNames方法

6、ServletResponse简介

Servlet API中定义的ServletResponse接口类用于创建响应消息。

HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。

(1)getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印到客户的浏览器上。

(2)设置响应的内容类型: response.setContentType("application/msword");

7、GenericServlet

(1)是一个 Serlvet,是 Servlet 接口和 ServletConfig 接口的实现类,但是一个抽象类,其中的 service 方法为抽象方法。

(2)如果新建的 Servlet 程序直接继承 GenericSerlvet 会使开发更简洁。

(3)具体实现:

①. 在 GenericServlet 中声明了一个 SerlvetConfig 类型的成员变量, 在 init(ServletConfig) 方法中对其进行了初始化

②. 利用 servletConfig 成员变量的方法实现了 ServletConfig 接口的方法

③. 还定义了一个 init() 方法, 在 init(SerlvetConfig) 方法中对其进行调用, 子类可以直接覆盖 init() 在其中实现对 Servlet 的初始化.

④. 不建议直接覆盖 init(ServletConfig), 因为如果忘记编写 super.init(config); 而还是用了 SerlvetConfig 接口的方法,则会出现空指针异常.

⑤. 新建的 init(){} 并非 Serlvet 的生命周期方法. 而 init(ServletConfig) 是生命周期相关的方法.

源码:

public abstract class GenericServlet implements Servlet, ServletConfig,        java.io.Serializable {    private static final long serialVersionUID = 1L;    private transient ServletConfig config;    public GenericServlet() {    }    @Override    public void destroy() {    }    @Override    public String getInitParameter(String name) {        return getServletConfig().getInitParameter(name);    }    @Override    public Enumeration getInitParameterNames() {        return getServletConfig().getInitParameterNames();    }    @Override    public ServletConfig getServletConfig() {        return config;    }    @Override    public ServletContext getServletContext() {        return getServletConfig().getServletContext();    }    @Override    public String getServletInfo() {        return "";    }    @Override    public void init(ServletConfig config) throws ServletException {        this.config = config;        this.init();    }    public void init() throws ServletException {    }    public void log(String msg) {        getServletContext().log(getServletName() + ": " + msg);    }    public void log(String message, Throwable t) {        getServletContext().log(getServletName() + ": " + message, t);    }    @Override    public abstract void service(ServletRequest req, ServletResponse res)            throws ServletException, IOException;    @Override    public String getServletName() {        return config.getServletName();    }}


8、HttpServlet

(1)是一个 Servlet,继承自 GenericServlet,针对于 HTTP 协议所定制。

(2)在 service() 方法中直接把 ServletReuqest 和  ServletResponse 转为 HttpServletRequest 和 HttpServletResponse;并调用了重载的 service(HttpServletRequest, HttpServletResponse);在 service(HttpServletRequest,HttpServletResponse) 获取了请求方式: request.getMethod();根据请求方式有创建了doXxx() 方法(xxx 为具体的请求方式,比如 doGet, doPost)。

(3)实际开发中,直接继承 HttpServlet,并根据请求方式复写 doXxx() 方法即可。

(4)好处:直接由针对性的覆盖 doXxx() 方法,直接使用 HttpServletRequest 和  HttpServletResponse,不再需要强转。

源码:

public abstract class HttpServlet extends GenericServlet {    private static final long serialVersionUID = 1L;    private static final String METHOD_GET = "GET";    private static final String METHOD_POST = "POST";    public HttpServlet() {    }    @Override    public void service(ServletRequest req, ServletResponse res)        throws ServletException, IOException {        HttpServletRequest  request;        HttpServletResponse response;        try {            request = (HttpServletRequest) req;            response = (HttpServletResponse) res;        } catch (ClassCastException e) {            throw new ServletException("non-HTTP request or response");        }        service(request, response);    }    protected void service(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException {        String method = req.getMethod();        if (method.equals(METHOD_GET)) {            doGet(req, resp);        } else if (method.equals(METHOD_POST)) {            doPost(req, resp);        } else {        }    }    protected void doGet(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException{    }    protected void doPost(HttpServletRequest req, HttpServletResponse resp)        throws ServletException, IOException {    }}

关注公众号:Java后端生活,干货文章第一时间送达!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,301评论 1 92
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,174评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • http://blog.csdn.net/luman1991/article/details/52678559 基...
    Nic_ofh阅读 1,810评论 0 3
  • 足够的爱,足够包围自己周遭的一切。尽管现在的你不在我的身旁,而我也不会迷茫到不知所向。 总有一两个人,总有一两...
    赵小馥阅读 245评论 0 1