Servlet&Jsp

一、Servlet
(1)Servlet基础
  Servlet是运行在Web服务器或应用服务器,它担当Web 浏览器或其他Http 客户程序发出的请求,数据库或应用程序之间的中间层。

这里写图片描述

  Servlet 的任务是: 首先读取客户端发送的数据、隐式HTTP数据(Cookie等), 然后进行处理,期间可能访问数据库,调用其他服务等, 最后响应数据,包括处理结果文档(HTML/XML、二进制等),发送隐式HTTP数据(设置返回文档类型、cookie缓存参数等)。
  Servlet一般扩展HttpServlet,根据数据发送的方式(GET、POST)调用相应的service方法处理。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletTemplate extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}

(2)Servlet生命周期
  服务器只创建每个servlet的单一实例,每个用户的请求都会引发新的线程-将请求交付给doGet或doPost进行处理
  Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy():
  ① 首先,web容器通过调用init()方法来初始化Servlet实例,这个方法在Servlet实例的生命周期里只调用一次。
  ② 接着,web容器调用Servlet的service()方法来处理每一个请求,根据收到的HTTP请求的类型,调用doGet或doPost方法
  ③ 最后,web容器调用destroy()方法来终结Servlet,在Servlet的生命周期里只能调用一次。
  
(3)Servlet的特点
  Servlet是Java技术对CGI编程的回答,Servlet程序在服务器端运行,动态地生成Web页面,与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有以下特点:
① 高效:传统的CGI中对每个请求都要启动一个新的进程,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码
② 方便:Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
③ 可移植性好:Servlet用Java编写,Servlet API具有完善的标准。因此,为I-Planet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。
(4)Servlet工作原理
https://www.ibm.com/developerworks/cn/java/j-lo-servlet/

二、Jsp
  我们可以将Servlet看作含有HTML的Java代码;将JSP看作含有Java代码的HTML。JSP(JavaService Page)页面最终要转换成servlet,并进行编译,请求期间执行的其实是编译后的servlet,所以编写Jsp实际上不过是另一种编写Servlet的方式。
  Jsp页面要转换成Servlet,servlet编译后载入到服务器中,初始化并执行,每一步的执行时间如下:
  • Jsp页面仅在修改后第一次访问时,才会转换成Servlet并编译
  • 载入到内存中、初始化和执行遵循Servlet的一般规则
**注:**Jsp页面生成的Servlet使用_jspService方法,不是doGet和doPost方法,初始化用jspInit方法,不是init方法

Jsp页面转servlet

(1)Jsp内置对象、动作
在Servlet编写doGet方法时

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    HttpSession session = request.getSession();
    PrintWriter out = response.getWriter();
    ...
}

Servlet API已经告诉了doGet的参数类型,JSP将 doGet 改为 _jspService,谁告诉你应该使用什么样的变量呢?没有人,你可以按照自己的意愿任意选取
JSP自动生产的Servlet中的 _jspService自动定义了 9 个局部变量,也成为”隐含对象”分别为:
 ① Request 与请求相关联的 HttpServletRequest,获取请求的参数、类型(GET、POST)、HTTP包头(cookie等),作用域 Request
 ② Response 与发往客户端的响应相关的 HttpServletResponse,作用域 Page
 ③ Session HttpSession对象,作用域 Session
 ④ Application 和 getServletContext 返回的类型相同,都为ServetContext,作用域Application
 ⑤ Config ServletConfig对象,作用域 Page
 ⑥ PageContext 通过它可以访问页面的许多属性,getRequest、getResponse、getSession、getOut等,页面上下文对象,作用域 Page
 ⑦ Page this的同义词,页面对象,作用域Page
 ⑧ Out 将输出发送到客户程序的Writer,不是PrintWriter,是JspWriter,作用域Page
 ⑨ Exception 只有在page指令中具有属性isErrorPage=”true”时才有效,作用域 Page
${ EL Expression} JSP EL表达式

Jsp动作、语法
 ① <!- - Blah - -> HTML注释,发送给客户,但不被浏览器显示
 ② <%- - Blah - -%> JSP注释,开发人员注释,不发送到客户程序
 ③ <%= Java Value %> JSP表达式,每次请求页面都计算并发送到客户程序
 ④ <% Java Statement %> JSP Scriptlet,每次请求页面时执行的一个或多个语句
 ⑤ <%! Method/Field Definition %> JSP声明,成为类定义的一部分字段或方法
Jsp动作:http://blog.csdn.net/java958199586/article/details/6914278
 ⑥ jsp:include:将其他HTML页面或JSP页面中的内容合并到当前页面,或将其中的文件插入到当前页面
 ⑦ jsp:forward:重定向,从一个JSP文件向另一个文件传递一个包含用户请求的request对象,把请求转到一个新的页面

Jsp指令
① include指令:<%@ include … %>
② taglib指令:<%@ taglib … %>
③ Page指令: <%@ page … %>

**注:**include指令和jsp:include的区别:
 inlcude指令读入指定页面的内容并把这些内容和原来的页面融合到一起。这个过程发生在JSP转化成Servlet的阶段,最终所合成的JSP文件被Servlet容器转化成Servlet。如果一个JSP页面使用include指令包含了另一个JSP页面,最终也只产生一个Servlet的Java源文件和一个class文件。相当于兵合一处,将打一方。
 < jsp:include>动作包含其他JSP页面,本质是调用了被包含文件所转化的Servlet对象的jspService()方法。即所被包含的JSP文件也对应有生成的Servlet源文件和class文件。如果一个JSP页面使用include动作包含了另一个JSP页面,会产生两个Servlet源文件和两个class文件

http://www.tuicool.com/articles/F7rYNvv

Java高级软件工程师面试考纲 :http://mp.weixin.qq.com/s?__biz=MjM5Mzk3MzA4MA==&mid=402204298&idx=2&sn=22fad36d023a798d6c0010c4fcecd73b&scene=0#wechat_redirect

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值