JSP技术-阿里云开发者社区

开发者社区> 开发与运维> 正文

JSP技术

简介: 一、 jsp入门 java server pages sun公司推出的一种用于开发动态web资源的技术 1. web资源的运行原理     html: 静态web资源,DefaultServlet读取html文件,通过response输出给IE浏览器     Servlet: 动态web资源,web容器(Servlet引擎)解析web.xml文件,找到url对应的java

一、 jsp入门

java server pages

sun公司推出的一种用于开发动态web资源的技术

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的时候 如果jsp没有任何的改动,

     web容器就不会翻译了 而是找刚才的Servlet为用户服务

 

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的页面情况

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 才会出现乱码问题

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  中国

 

jsp 乱码解决  告诉jsp引擎jsp页面是什么码,这样翻译才不会错

告诉response用什么码编码再发给浏览器

 

三、 jsp 九个隐式对象 (面试)

1. 面试题:

列举出jsp页面的九个隐式对象,并加以说明

 

对象变量名,可直接在jsp中使用

对象类型

config

 

application

 

response

 

request

 

session

 

out

 

page

 

exception

 

pageContext

 

 

2. out 对象

JspWriter类型, 带缓冲的字符流   类似BufferedWriter

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

 

什么情况下 JspWriter 会将数据刷新

1) 缓冲区写满(默认大小为8kb, 可以在page指令中通过 buffer属性设置缓冲区大小)

2) jsp 页面结束

 

注意:

1)jsp中输出数据尽量使用 out 不要使用response直接获得流输出

原因在于, 写入 out 的数据会进缓冲区 再刷新到response, 如果两个都用,会导致后写的数据显示在前面

2)jsp 页面结束时会自动调用 response.getWriter() 将数据刷新

所以在jsp中不要调用 getOutputStream()

当然也不方便做文件下载

 

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开发中的四个域(重点)

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

 

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

声明周期就是指对象的创建到销毁的期间

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

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

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

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

 

 

2. 四个域的作用范围

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

域: 即范围的意思

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

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

 

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 细节

1. jsp 出错

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

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

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

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

 

六、内省

1. javabean

    固定写法的java

    1)必须有无参构造函数

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

    3)提供标准的gettersetter

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

   

2. 通过反射的方式访问javabean

    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页面指令不能发生冲突

    其中,import可以冲突

 

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> 获得属性值

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章