java server page
html: 静态web资源,DefaultServlet读取html文件,通过response输出给IE浏览器
Servlet: 动态web资源,web容器(Servlet引擎)解析web.xml文件,找到url对应的java类
通过反射创建Servlet对象,调用service方法
Class.forName(“cn.itcast.servlet.Servlet 1” ).newInstance();
jsp: 动态web资源
jsp页面在第一次被访问的时候,web容器(jsp引擎)会将jsp翻译成一个Servlet,然后调用servlet的service方法
jsp 翻译后的Servlet会被放到
%tomcat安装目录%\work\Catalina\localhost\webcontext
当jsp页面被再次访问的时候,web容器会去直接调用Servlet的方法,所以通常来讲 jsp 只是在第一次被访问的时候比较慢
如果jsp页面做了修改,此时web容器会重新翻译jsp
实际上 jsp 就是 Servlet , 只是提供了一种比较直观的书写方式,因为写jsp就像在写Html
jsp中可以写 java 代码, 有两种写法
1) jsp 脚本表达式
内容会被放到 out.print() 里面 输出个浏览器
<%=new Date() %>
2) jsp脚本片段
内容会原封不动地被翻译到 Servlet 的service方法中
<%
// java 代码
%>
1) Servlet 适合写java代码,因为Servlet就是一个java类
在开发中使用Servlet对用户发送的请求进行处理并做出响应
获得请求参数 找dao做增删改查 对数据进行运算 对页面进行跳转
2) jsp 适合做数据美化,作为 数据显示模板
因为jsp页面直接书写HTML标签
3) 项目中的web层通常使用mvc设计模式 Servlet+jsp+javabean
其中, Servlet做控制器,处理用户请求
jsp作为显示模板
javabean 作为封装数据的实体
4) 如何养成一种良好的编码风格
在Servlet中应避免做任何的数据输出
在 jsp 中应避免去直接书写java代码, 而实际上要做到这点很难, 所以需要用到 el 和 jstl
在 jsp 页面中所有的 html 标签部分被称作模板元素,用于对整个网页进行布局
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 {
.......
}
%>
Jsp指令用于向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) pageEncoding
通知jsp引擎在翻译jsp的过程中以什么编码方式来解码jsp文件
通知 Servlet引擎 response编码方式,相当于 response.setContentType()
说白了
只要给jsp指定了 pageEncoding=”utf -8”
jsp引擎在翻译jsp时, 就会自动加上一句
response.setContentType(“text/html;charset=utf -8” )
列举出jsp页面的九个隐式对象,并加以说明
Jsp的九个隐式对象就是 翻译完的Servlet的service方法的形参和局部变量
对象变量名,可直接在jsp中使用 |
对象类型 |
config |
ServletConfig |
application |
ServletContext |
response |
HttpServletResponse |
request |
HttpServletRequest |
session |
HttpSession |
out |
JspWriter |
page |
this |
exception |
Throwable |
pageContext |
PageContext |
JspWriter类型, 带缓冲的字符流 (包装流) BufferedWriter
写入该流的数据最终会被刷新到 response , 调用response.getWriter().write() 方法
什么情况下 JspWriter 会将数据刷新
1) 缓冲区写满(默认大小为8kb, 可以在page指令中通过 buffer属性设置缓冲区大小)
2) jsp 页面结束
Jsp引擎刷新缓冲区的方式: response.getWriter().write();
注意:
1)jsp中输出数据尽量使用 out 不要使用response直接获得流输出
原因在于, 写入 out 的数据会进缓冲区 再刷新到response, 如果两个都用,会导致后写的数据显示在前面
2)jsp 页面结束时会自动调用 response.getWriter() 将数据刷新
所以在jsp中不要调用 getOutputStream()
当然也不方便做文件下载
结论: 在 jsp 中用 out 输出数据
主要功能,用于获得其他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()
依次去四个域对象中找属性,顺序 page request session application, 找到了就返回 如果四个域中都没有就返回null