Jsp jsp实现原理

01_JSP的概述&入门案例
JSP概述
全称是Java Server Pages,他和Servlet一样,也是Java所提供的一门用于开发动态WEB资源的技术,
JSP也是JavaEE的规范之一,JSP的底层其实就是Servlet。
JSP的特点
编写JSP就像编写HTML一样
JSP和HTML的区别
HTML只能向客户端提供静态数据
JSP技术允许我们在页面中嵌套Java代码,从而可以向客户端提供动态的数据

Servlet本身的缺点
1,每一个Servlet都需在web.xml进行配置
2,显示html元素的时候非常麻烦

jsp = html + java + jsp自身的东西 本质Servlet
   很久以前基本上开发全部都是用jsp 可读性非常(html里面加了java代码)
单纯的jsp页面不适合做这种大型项目 


02_JSP的原理
一个JSP文件第一次被客户端访问时(也包括JSP文件修改后的第一次被访问),WEB服务器会把JSP文件翻译成一个Servlet,
客户端访问JSP文件,其实访问的就是JSP文件翻译后的Servlet,
JSP的底层原理其实就是Servlet。

谈谈对Servlet和jsp理解
jsp本质是一个Servlet,他的运行也需要容器(tomcat)支持
在jsp和Servlet文件中都可以编写java和html代码,不同的是
Servlet虽然可以动态的生成页面内容,但是更加偏向于逻辑的控制
jsp最终被转换成 Servlet 在jvm里面执行,在jsp里面虽然可以编写java代码,但是他更加偏向于页面内容的展示
在MVC架构模式中,C通常是由Servlet充当,V通常是由jsp充当

Jsp jsp实现原理

03_JSP默认编码设置
  window - preference -搜索jsp  把Encoding改成UTF-8
  
  <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  是jsp本身的编码设置,contentType服务器端发给客户端的内容编码的设置(与response.setContentType("")作用是相同)
  pageEncoding 当前jsp页面本身的编码 
 
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  是告诉浏览器 生成的页面(这个页面是用来展示服务器发来的数据) 所使用的格式和编码,浏览器会根据此来调用相应的
字符集来显示网页内容
http-equiv类似我们http的头部协议,他回应浏览器一些有用的信息,以帮助浏览器正确和精确的显示网页内容

 建议: 工作空间 项目 外加jsp页面 都设置成UTF-8  

04_模版元素&脚本片段
模版元素
JSP页面中的HTML标签,CSS样式,以及JS都称之为JSP的模版元素,模版元素定义了页面的结构和外观,
JSP翻译后的Servlet中,模版元素会被输出流对象直接发送到客户端。
脚本片段
JSP页面中可以嵌套Java代码,Java代码要定义在JSP的脚本片段中,也就是<%%>里面,
JSP页面中可以有多个脚本片段,
多个脚本片段之间,可以嵌套文本,嵌套HTML的标签,嵌套其他的JSP元素。


注意: 不能在脚本片段里面定义方法,因为方法不能嵌套定义

模板元素其实就是页面上一堆的html代码
在html中添加java代码,java代码就是脚本片段

//两种方式
if(4>0){ 
<form>
用户名:<input type="text"/>
密码:<input type="password"/>
</form>

}


05_声明
在JSP页面里定义方法,定义成员变量等,<%! %>
 
注意:不能在声明里面写语句

平时也很少去定义成员变量 ,他是有线程安全问题 用处不大



06_脚本表达式
在JSP页面中将数据发送到客户端,替代JSP页面里的输出语句,
格式:<%=变量/常量/表达式%> //1 + 1

注意:在脚本表达式中不可以写分号

总结: 用syso输出的语句,都可以用脚本表达式输出



07_注释
HTML的注释:<!-- -->
Java代码的注释://,/**/
脚本片段的注释:<%-- --%>

注意:
HTML的注释:被注释的文本和代码,会翻译到Servlet中,然后发送到客户端
java的注释:被注释的文本和代码,会翻译到Servlet中,不会发送到客户端
jsp的注释: 被注释的文本和代码,不会翻译到Servlet中,不会发送到客户端

建议使用第三个 功能最强大 什么都可以注释,也不会翻译最后html中


语法:
模板元素: Html + css + js 对于模板元素,会被翻译到out.println(参数);
脚本片段;java 原样复制到翻译后的java文件里面,复制到service方法   <% %>
java声明;翻译到类中,方法外,成员的位置上,可以用来定义成员变量,成员方法<%! %>
脚本表达式:翻译到out.println(参数),注意不能有分号    <%= %>
注释:HTML的注释  java的注释 jsp的注释  <%-- --%>

08_指令的概述
指令概念
指令并不会直接产生任何可见的输出,作用是告诉WEB服务器如何处理JSP页面的其他部分。

指令的分类
page include taglib

基本格式
<%@ 指令名称 属性="值" %>分类
<%@ page contentType="text/html;charset=UTF-8" %>

如果一个指令有多个属性,可以把多个属性写在同一个指令中,也可以把多个属性分开来写
<%@ page contentType="text/html;charset=UTF-8" import="java.util.Date" %>

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.Date" %> 


09_page指令的属性
page
用于定义JSP页面的各种属性,无论定义在JSP页面的哪个位置,所影响的都是整个JSP页面,
建议:将page指令定义在JSP页面的起始位置

属性:
contentType:设置响应的类型和编码
pageEncoding:设置JSP页面的编码,也设置JSP页面翻译成Servlet源文件的编码
import:导入JSP页面所需要使用的Java类
默认已经导入的类
java.lang.*;
javax.servlet.*;
javax.servlet.jsp.*;
javax.servlet.http.*;

导包 Alt + /  用 ctrl + shift + O 没有用的

10_page指令的其他属性
session:设置是否自动创建内置对象session,默认值是true
buffer:设置内置对象out的缓冲区大小,默认值是8k
autoFlush:设置内置对象out是否会自动刷新,默认值是true
extends:设置JSP翻译后的Servlet要继承哪个类,默认值是HttpJspBase
language:设置脚本语言,只有一个值就是java,java也是默认值
isThreadSafe:设置JSP是否是多线程,默认值是true SingleThreadModel

一个软件的默认值的设置,考经验得来的
刚开始,靠项目经理的经验设置
之后,通过压力测试,试运行,通过真实的用户数据 分析之后再做出优化 才去调整
贸然去改 会对系统造成很大的影响

页面输出4-5k
缓冲区设置成64K 占用的内存多,浪费资源
缓冲区设置成1k 一次缓冲不够存,就会频繁的刷新,效率比较低

注意:
默认是多线程 也就是jsp可以同时被多个客户端访问


11_JSP的异常处理机制
分类设置 
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/error.jsp</location>
</error-page>


统一设置
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>

第一步: 在web.xml下增加一个error-page标签
第二步: 创建错误提示页面

404-我们正在加紧建设中!  
500-服务器忙,请稍后再试!


12_include指令&taglib指令
include (静态包含指令)
用于在JSP页面中包含其他的WEB资源,把多个WEB资源一起翻译到了一个Servlet中
属性:
file:设置要包含的WEB资源的路径
taglib
引入标签库
属性:
uri:设置引入标签库的路径
prefix:设置引入标签库的别名


13_JSP的九大内置对象
HttpServletRequest request 请求对象
HttpServletResponse response 响应对象
JspWriter out 输出流对象
HttpSession session 会话对象
Throwable exception 异常对象
ServletContext application 代表了整个WEB应用
ServletConfig config 配置参数,用于获取Servlet的配置参数
Object page Servlet的对象,方法中的this对象
PageContext pageContext JSP页面的上下文对象

好处:提高开发效率

14_PageContext的概述和测试
PageContext是JSP技术中最重要的一个对象,他代表了JSP页面的运行环境,
PageContext封装了其他八个内置对象,
PageContext也是一个域对象,可以用来保存数据,范围是当前页面,
PageContext提供了一些WEB开发的常用功能,比如转发和包含,还可以操作检索其他域对象中的数据。

注意:
一定要放对位置,把对象放到session里面 在 Context里面是找不到的

pageContext.findAttribute("username");会在4个域对象当中查找数据,顺序pageContext,request,session,application

pageContext 页面上下文 他其实就是相当于大管家
他包含所有的对象,但是他自己功能很弱
1,获取其他八个对象(用的很少,但是重要)
2,作为域对象存储数据(鸡肋)
  setAttribute(key,value);
  getAttribute();
  removeAttribute();
3,进行转发和包含(用的不多)
4,获取所有的4个域对象的数据(重要)
  setAttribute(key,value,int scope);
  getAttribute(key,int scope);
  removeAttribute(key,int scope);
  findAttribute(key )
  依次 pageContext,request,session,application查找


15_JSP的四大域对象
pageContext 当前页面
request 当前请求
session 整个会话
application 整个应用


------补充-----

16_jsp的动作标签
 作用: 简化<% %>的写法 
 常用的动作标签
<jsp:forward />:请求转发
<jsp:include />:页面包含(动态包含)


区别
动态包含是两个文件先编译执行,然后把执行结果包含在一起
静态包含是先将2个文件合并成为一个java文件,然后在编译,执行

动态包含只能包含jsp文件,静态包含可以包含任何文件(html,txt)

Jsp jsp实现原理