博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsp技术
阅读量:5279 次
发布时间:2019-06-14

本文共 11731 字,大约阅读时间需要 39 分钟。

一、 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 中必须要写的java代码,从域对象中取出数据)

 

二、 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 被翻译的Servletservice方法中将不获取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(当前servlet对象)

exception

Throwable

pageContext 

PageContext

注意:

exception对象不是每个页面都有  只有是错误页面(errorPage),并且 isErrorPage属性设置为true

session 对象也不是每个页面都有  默认情况下有,但是如果将page指令的 session=”false”,则没有session内置对象

 

2. out 对象

JspWriter类型带缓冲的字符流 (包装流)  BufferedWriter

写入该流的数据最终会被刷新到 response  , 调用response.getWriter().write(buffer) 方法

 

什么情况下 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个对象) 

3) pageContext.setAttribute(String name, objevt value, int scope)

scope 是个常量其值分别如下

1        pageContext.PAGE_SCOPE

2        pageContext.REQUEST_SCOPE

3        pageContext.SESSION_SCOPE

4        pageContext.APPLICATION_SCOPE

pageContext对象的setAttribute()方法可以将参数或者Java对象绑定到application对象、session对象、request对象或者page对象上

当scope参数的值为pageContext.SESSION_SCOPE时,调用PageContext对象的setAttribute()方法和调用session对象的setAttribute()方法是等效的,都是将某个参数或者Java对象和当前的session绑定起来。

如果scope参数的值为pageContext.APPLICATION_SCOPE,那么调用PageContext对象的setAttribute()方法和调用application对象的setAttribute()方法是等效的。

如果scope参数是其他的值,原理也是一样的,使用如下:

1.存

<%            pageContext.setAttribute("jaky", "苍井空", PageContext.PAGE_SCOPE);            pageContext.setAttribute("jaky", "波多野结衣", PageContext.REQUEST_SCOPE);            pageContext.setAttribute("jaky", "泷泽萝拉", PageContext.SESSION_SCOPE);            pageContext.setAttribute("jaky", "樱井莉亚", PageContext.APPLICATION_SCOPE);%>

2.取

<%=pageContext.getAttribute("jaky", PageContext.PAGE_SCOPE)%>
<%=pageContext.getAttribute("jaky", PageContext.REQUEST_SCOPE)%>
<%=pageContext.getAttribute("jaky", PageContext.SESSION_SCOPE)%>
<%=pageContext.getAttribute("jaky", PageContext.APPLICATION_SCOPE)%>

 

4) pageContext 有个特殊的方法 findAttribute()

依次在page,request,session()application Scope()查找以name为名的Attribute,找到就返回对象,都找不到就返回null

 

四、 web开发中的四个域(重点)

范围由小到大: pagejsp有效) request(一次请求) session(一次会话) application(当前web应用)

page : PageContext对象

request : HttpServletRequest对象

session : HttpSession对象

application : ServletContext对象

 

class Request {    private Map
attributes = new HashMap(); public void setAttribute(String name, Object value) { attributes.put(name,value);  }    public Object getAttribute(String name) {   return attributes.get(name);  }    public void removeAttribute(String name) {   attributes.remove(name);  }}

 

1. 4个对象的生命周期?

生命周期就是指对象的创建到销毁的期间

page:  jsp 页面被执行,生命周期开始,jsp 页面执行完毕 ,生命周期结束

request : 用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束

session : 用户打开浏览器访问,创建session(开始)session超时或被声明失效,该对象生命周期结束

application: web应用加载的时候创建(开始), web应用被移除或服务器关闭,对象销毁(结束)

 

 

2. 四个域的作用范围

什么是域?为什么把这4个对象叫做域对象呢?

域: 即范围的意思

web中的域对象,可以存储对象,在作用范围内都可以取到

内部是Map集合的实现 Map<String, Object>

 

class PageContext {  private Map attributes = new HashMap();  private HttpSession session;  ……    public void setAttribute(String name, Object value) {      attributes.put(name, value);  }    public Object getAttribute(String name) {      attributes.get(name);  }  public void removeAttribute(String name) {      attributes.remove(name);  }}

 

 

page:  只在当前jsp页面有效

request: 只在当前请求有效, 每次请求分别对应不同的request域对象

// session: 默认情况下,同一个浏览器来访问有效(发送同一个sessionid)

session : 只在一次会话中有效,会话结束就无法取到数据了 (特殊情况,发送Cookie)

application : 在一个web应用中有效  (只要服务器不关,web应用不移除就可以取数据)

四个域对象的范围由小到大排列依次为: page request session application

 

3. 哪种情况下用哪种域对象。

原则: 四个域对象在选择的时候,能用范围小的绝不用范围大的

page: 数据只是暂时存在集合,在jsp页面的其他地方要用,用page(页面中自定义的map)

 什么时候需要用map了,就用page

request:数据只是做显示的,看完了就没用了,就存request

 请求转发, Servlet 产生的处理结果(数据交给jsp显示,

session: 数据给用户看完了,一会还要用,会话结束了就没用了

 用户登陆,用户信息发给客户端看,看完了,一会访问别的页面还要看用户信息

 购物车,购物成功了,给用户看购物车,待会随时可以查看购物车

 请求重定向,因为是两次请求,第一次请求的数据,第二次请求还要看

application : 数据给一个用户用完了,别人还要用

聊天室,聊天记录,需要给所有的用户看

统计网站在线人数,所有人看到的应该是一个数

 

总结: 需要定义Map不如用page,请求转发Servlet带给jsp的数据存request

请求重定向带过去的数据存Session,全局的数据存application

 

五、 jsp 细节

只有当jsp页面指定的page指令isErrorPagetrue时,才有exception隐式对象

Session对象 不是每个jsp页面都能用的  前提是 page指令的session属性为true

 

Jsp注释: 

 

jsp 出错

1) 被翻译的Servlet不能编译,语法错,这时会报告是因为jsp中的哪行导致不能编译

2) 翻译的Servlet 在运行期间出现异常, 报告是jsp的哪行导致的异常

此时会进一步报告导致异常的原因,在Servlet中的哪行出现异常

2. jsp 映射 也是通过servlet 元素

 

六、内省(neixing)

1. javabean 

固定写法的java

1)必须有无参构造函数

2)属性必须私有,我们称为字段

3)提供标准的gettersetter

例: name 字段 的getter: String getName()  settter: void setName(String name)

 

2. 什么是内省

内省通过反射的方式访问javabean

Jdk中的api : PropertyDescriptor类操作Bean的属性

 

3.BeanUtils工具包

Apache组织开发了一套用于操作JavaBeanAPI(内省)

核心类 BeanUtils

setProperty(bean, name, value)

copyProperties(target, source);

可以支持String8中基本数据类型转换

其他引用数据类型都需要注册转换器 ConvertUtils.register(Converter, Class)

 

3. WebUtils 工具类

实现任何request提交的表单封装到对应的javabean

 

 

七、 jsp标签(可选)

为了移除jsp页面的java代码,sun公司提供了一些内置的标签

我们称为jsp标签,或jsp动作元素

 

1. <jsp:include> 相当于 RequestDispatcher 对象的页面引入

dispatcher.include  实现 Servlet包含

dispatcher.forward  实现servlet转发  

forward 在转发时 web容器会清空response中的数据

在转发之后就无法向response写入数据

 

动态引入方式,在程序运行期间引入,jsp被翻译成两个

include指令也能实现页面的引入,静态引入,将两个jsp翻译成一个Servlet

 

包含和被包含的jsp页面指令不能发生冲突

其中,importpageEncoding可以冲突

 

 

2. <jsp:forward> 实现请求转发

结合 <jsp:param> 标签传参,自动进行url编码,编码的方式参照request编码

 

3. <jsp:useBean id class scope> 内省

反射创建javabean,以id作为key存入指定的域

其实在创建之前,会先去域中找,找到了则不创建

 

4. <jsp:setProperty> 设置属性值

<jsp:setProperty name=user property=username value=zs />

<jsp:setProperty name=user property=username param=username />

<jsp:setProperty name=user property=* /> 批量

 

5. <jsp:getProperty> 获得属性值

 

八、web开发模式

Sun公司针对web开发提供了两种模式

Model1: jsp+javabean  只适合小型应用

Model2: servlet+jsp+javabean    mvc

page:  只在当前jsp页面有效

request: 只在当前请求有效, 每次请求分别对应不同的request域对象

// session: 默认情况下,同一个浏览器来访问有效(发送同一个sessionid)

session : 只在一次会话中有效,会话结束就无法取到数据了 (特殊情况,发送Cookie)

application : 在一个web应用中有效  (只要服务器不关,web应用不移除就可以取数据)

四个域对象的范围由小到大排列依次为: page request session application

 

3. 哪种情况下用哪种域对象。

原则: 四个域对象在选择的时候,能用范围小的绝不用范围大的

page: 数据只是暂时存在集合,在jsp页面的其他地方要用,用page(页面中自定义的map)

 什么时候需要用map了,就用page

request:数据只是做显示的,看完了就没用了,就存request

 请求转发, Servlet 产生的处理结果(数据交给jsp显示,

session: 数据给用户看完了,一会还要用,会话结束了就没用了

 用户登陆,用户信息发给客户端看,看完了,一会访问别的页面还要看用户信息

 购物车,购物成功了,给用户看购物车,待会随时可以查看购物车

 请求重定向,因为是两次请求,第一次请求的数据,第二次请求还要看

application : 数据给一个用户用完了,别人还要用

聊天室,聊天记录,需要给所有的用户看

统计网站在线人数,所有人看到的应该是一个数

 

总结: 需要定义Map不如用page,请求转发Servlet带给jsp的数据存request

请求重定向带过去的数据存Session,全局的数据存application

 

五、 jsp 细节

只有当jsp页面指定的page指令isErrorPagetrue时,才有exception隐式对象

Session对象 不是每个jsp页面都能用的  前提是 page指令的session属性为true

 

Jsp注释: 

 

jsp 出错

1) 被翻译的Servlet不能编译,语法错,这时会报告是因为jsp中的哪行导致不能编译

2) 翻译的Servlet 在运行期间出现异常, 报告是jsp的哪行导致的异常

此时会进一步报告导致异常的原因,在Servlet中的哪行出现异常

2. jsp 映射 也是通过servlet 元素

 

六、内省(neixing)

1. javabean 

固定写法的java

1)必须有无参构造函数

2)属性必须私有,我们称为字段

3)提供标准的gettersetter

例: name 字段 的getter: String getName()  settter: void setName(String name)

 

2. 什么是内省

内省通过反射的方式访问javabean

Jdk中的api : PropertyDescriptor类操作Bean的属性

 

3.BeanUtils工具包

Apache组织开发了一套用于操作JavaBeanAPI(内省)

核心类 BeanUtils

setProperty(bean, name, value)

copyProperties(target, source);

可以支持String8中基本数据类型转换

其他引用数据类型都需要注册转换器 ConvertUtils.register(Converter, Class)

 

3. WebUtils 工具类

实现任何request提交的表单封装到对应的javabean

 

 

七、 jsp标签(可选)

为了移除jsp页面的java代码,sun公司提供了一些内置的标签

我们称为jsp标签,或jsp动作元素

 

1. <jsp:include> 相当于 RequestDispatcher 对象的页面引入

dispatcher.include  实现 Servlet包含

dispatcher.forward  实现servlet转发  

forward 在转发时 web容器会清空response中的数据

在转发之后就无法向response写入数据

 

动态引入方式,在程序运行期间引入,jsp被翻译成两个

include指令也能实现页面的引入,静态引入,将两个jsp翻译成一个Servlet

 

包含和被包含的jsp页面指令不能发生冲突

其中,importpageEncoding可以冲突

 

 

2. <jsp:forward> 实现请求转发

结合 <jsp:param> 标签传参,自动进行url编码,编码的方式参照request编码

 

3. <jsp:useBean id class scope> 内省

反射创建javabean,以id作为key存入指定的域

其实在创建之前,会先去域中找,找到了则不创建

 

4. <jsp:setProperty> 设置属性值

<jsp:setProperty name=user property=username value=zs />

<jsp:setProperty name=user property=username param=username />

<jsp:setProperty name=user property=* /> 批量

 

5. <jsp:getProperty> 获得属性值

useBean实例

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="com.bjsxt.domain.Book"%><%    String path = request.getContextPath();    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%>            jaky                <%--            //获得数据                    request.setCharacterEncoding("UTF-8");            String id = request.getParameter("id");            String title = request.getParameter("title");            String price = request.getParameter("price");                        //封装            Book book = new Book();            book.setId(id);            book.setTitle(title);            book.setPrice(price);                        //打印            out.print(book);  //对象执行的toString()                --%>        
<%=pageContext.getAttribute("book")%>

<%=pageContext.getAttribute("book2")%>

<%=pageContext.getAttribute("book3")%>

<%=pageContext.getAttribute("book4") %>

 

 

 

 

八、web开发模式

Sun公司针对web开发提供了两种模式

Model1: jsp+javabean  只适合小型应用

Model2: servlet+jsp+javabean    mvc

 

 

转载于:https://www.cnblogs.com/jaky/p/3307329.html

你可能感兴趣的文章
shell脚本统计文件中单词的个数
查看>>
SPCE061A学习笔记
查看>>
sql 函数
查看>>
hdu 2807 The Shortest Path 矩阵
查看>>
熟悉项目需求,要知道产品增删修改了哪些内容,才会更快更准确的在该项目入手。...
查看>>
JavaScript 变量
查看>>
java实用类
查看>>
smarty模板自定义变量
查看>>
研究称90%的癌症由非健康生活习惯导致
查看>>
命令行启动Win7系统操作部分功能
查看>>
排序sort (一)
查看>>
Parrot虚拟机
查看>>
Teamcenter10 step-by-step installation in Linux env-Oracle Server Patch
查看>>
Struts2学习(三)
查看>>
Callable和Runnable和FutureTask
查看>>
GitHub 多人协作开发 三种方式:
查看>>
文本域添加编辑器
查看>>
Yum安装MySQL以及相关目录路径和修改目录
查看>>
java获取hostIp和hostName
查看>>
关于web服务器和数据库的各种说法(搜集到的)
查看>>