jsp运行原理解析

  • 格式:doc
  • 大小:75.00 KB
  • 文档页数:8

一、 jsp入门 java server page 1. web资源的运行原理 html: 静态web资源,DefaultServlet读取html文件,通过response输出给IE浏览器 Servlet: 动态web资源,web容器(Servlet引擎)解析web.xml文件,找到url对应的java类 通过反射创建Servlet对象,调用service方法

Class.forName(“cn.itcast.servlet.Servlet1”).newInstance(); jsp: 动态web资源 jsp页面在第一次被访问的时候,web容器(jsp引擎)会将jsp翻译成一个Servlet,然后调用servlet的 service方法 jsp 翻译后的Servlet会被放到 %tomcat安装目录%\work\Catalina\localhost\webcontext 当jsp页面被再次访问的时候,web容器会去直接调用Servlet的service方法,所以通常来讲 jsp 只是在第一次被访问的时候比较慢 如果jsp页面做了修改,此时web容器会重新翻译jsp

2. jsp 是什么 实际上 jsp 就是 Servlet , 只是提供了一种比较直观的书写方式,因为写jsp就像在写Html

jsp中可以写 java 代码, 有两种写法 1) jsp 脚本表达式 内容会被放到 out.print() 里面 输出个浏览器 <%=new Date() %>

2) jsp脚本片段 内容会原封不动地被翻译到 Servlet 的service方法中 <%
// java 代码

%>

3. jsp 和 Servlet的区别 1) Servlet 适合写java代码,因为Servlet就是一个java类 在开发中使用Servlet对用户发送的请求进行处理并做出响应 2) jsp 适合做数据美化,作为 数据显示模板 因为jsp页面直接书写HTML标签

3) 项目中的web层通常使用mvc设计模式 Servlet+jsp+javabean 其中, Servlet做控制器,处理用户请求 jsp作为显示模板 javabean 作为封装数据的实体

4) 如何养成一种良好的编码风格 在Servlet中应避免做任何的数据输出 在 jsp 中应避免去直接书写java代码, 而实际上要做到这点很难, 所以需要用到 el 和 jstl

二、 jsp语法 1. 模板元素 在 jsp 页面中所有的 html 标签部分被称作模板元素,用于对整个网页进行布局 2. jsp脚本 jsp中的java代码被称作jsp脚本 有三种形式 1) 脚本表达式 被翻译到 out.print() 方法中 <%=new Date() %> 2) 脚本片段 被翻译到 service 方法中 <%
for(int i=0; i<10; i++) {
System.out.println(i);
}
%> 3) jsp 声明 被翻译到 service 方法外面 写成员变量\成员方法\静态代码块 <%!
private String name;
static {
.......
}
%> 3. jsp指令 include指令 用于包含一个页面 taglib 指令用于引入标签库文件 page指令 用于向jsp引擎说明jsp的页面情况 page指令一般都放在页面的开头,但是不管放在哪都对整个页面起作用 page指令 常用的主要有一下几个: 1) import 导包, 导入多个包时需要以“,”隔开 也可以分作多条指令书写 2) session 说明是否使用session 默认值为true,被翻译的Serlvet中会自动获得Session 如果将该值指定为false 被翻译的Servlet的service方法中将不获取session 3) errorPage 指定错误跳转的页面 在 web.xml 文件中同样可以配置错误页面 可根据异常类型或错误编码进行配置 error-page 4) pagaEncoding 通知jsp引擎在翻译jsp的过程中以什么编码方式来解码jsp文件 通知 Servlet引擎 response编码方式,相当于 response.setContentType() 说白了 只要给jsp指定了 pageEncoding=”utf-8” jsp引擎在翻译jsp时, 就会自动加上一句 response.setContentType(“text/html;charset=utf-8”)

扩展 : jsp 乱码问题 在 tomcat6 以后jsp就没有乱码问题了, 如果是使用tomcat5 才会出现乱码问题 jsp 乱码解决 告诉jsp引擎jsp页面是什么码,这样翻译才不会错 告诉response用什么码编码再发给浏览器

三、 jsp 九个隐式对象 (笔试) 1. 面试题: 列举出jsp页面的九个隐式对象,并加以说明

对象变量名,可直接在jsp中使用 对象类型 config ServletConfig application ServletContext response HttpServletResponse request HttpServletRequest session HttpSession out JspWriter page this

a.jsp 中国 gb2312码 98 99 jsp引擎 iso-8859-1 解码 Öйú Servlet Öйú

Servlet引擎 response 编码 iso-8859-1 98 99 response.setContentType ???ú gb2312 编码 乱上加乱

IE浏览器 98 99 iso-8859-1 ???ú gb2312 中国 exception Throwable(不是每个jsp都有) pageContext PageContext

2. out 对象 JspWriter类型, 带缓冲的字符流 (包装流) BufferedWriter 对response.getWriter() 进行了包装,提供了缓冲区,默认大小8KB 写入该流的数据最终会被刷新到 response , 调用response.getWriter().write() 方法

什么情况下 JspWriter 会将数据刷新 1) 缓冲区写满(默认大小为8kb, 可以在page指令中通过 buffer属性设置缓冲区大小) 2) jsp 页面结束(此流会被关闭,数据刷新到底层的流)

注意: 1)jsp中输出数据尽量使用 out 不要使用response直接获得流输出 原因在于, 写入 out 的数据会进缓冲区 再刷新到response, 如果两个都用,会导致后写的数据显示在前面 2)jsp 页面结束时会自动调用 response.getWriter() 将数据刷新 所以在jsp中不要调用 getOutputStream() 当然也不方便做文件下载

结论: 在jsp中用out输出数据

3. pageContext对象 主要功能,用于获得其他8大隐式对象 这样做的意义: 需要移除jsp中的java代码,就需要将java代码写到一个java类的成员方法中,然后想办法在jsp 页面中调用该方法,以达到代码复用的目的 由于在jsp中的java代码难免会访问8个隐式对象,因为这些对象都是和web开发相关的对象 要移除这部分java代码就需要将8个对象传递给java类的方法,为了方便,我们通常的做法是只传递一个 pageContext对象过去,这样在方法中就可以通过该对象很轻松地获得其他8个对象了

pageContext 也是一个域对象,但只是在当前jsp页面有效 重点: 1) 默写9个对象, (具体描述9个对象怎么用) 2) 理解pageContext对象的意义 (获得其他8个对象) pageContext 有个特殊的方法 findAttribute()

四、 web开发中的四个域(重点) 范围由小到大: page(jsp有效) request(一次请求) session(一次会话) application(当前web应用) page : PageContext对象 request : request对象 session : session对象 application : ServletContext对象

1. 这4个对象的生命周期? 生命周期就是指对象的创建到销毁的期间 page: jsp 页面被执行,生命周期开始,jsp 页面执行完毕 ,生命周期结束 request : 用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束 session : 用户打开浏览器访问,(getSession方法被调用)创建session(开始),session超时或被声明失效,该对象生命周期结束 application: web应用加载的时候创建(开始), web应用被移除或服务器关闭,对象销毁(结束)

2. 四个域的作用范围 什么是域?为什么把这4个对象叫做域对象呢? 域: 即范围的意思 web中的域对象,可以存储对象,在作用范围内都可以取到 内部是Map集合的实现 Map

class PageContext { private Map map = new HashMap(); private HttpSession session; …… }

page: 只在当前jsp页面有效 request: 只在当前请求有效, 每次请求分别对应不同的request域对象 // session: 默认情况下,同一个浏览器来访问有效(发送同一个sessionid) session : 只在一次会话中有效,会话结束就无法取到数据了 (特殊情况,发送Cookie) application : 在一个web应用中有效 (只要服务器不关,web应用不移除就可以取数据) 四个域对象的范围由小到大排列依次为: page request session application