jsp study

jsp技术入门

Jsp的简称:java server pagehtml

1. web资源的运行原理

html: 静态web资源,DefaultServlet读取html文件,经过response输出给IE浏览器java

Servlet: 动态web资源,web容器(Servlet引擎)解析web.xml文件,找到url对应的java类web

经过反射建立Servlet对象,调用service方法面试

Class.forName(“cn.itcast.servlet.Servlet1”).newInstance();设计模式

jsp: 动态web资源api

jsp页面在第一次被访问的时候,web容器(jsp引擎)会将jsp翻译成一个Servlet,而后调用servlet的浏览器

service方法 因此第一次访问的时候比较慢。tomcat

jsp 翻译后的Servlet会被放到服务器

%tomcat安装目录%\work\Catalina\localhost\webcontextsession

当jsp页面被再次访问的时候,web容器会去直接调用Servlet的 service方法,因此一般来说 jsp 只是在第一次被访问的时候比较慢

若是jsp页面作了修改,此时web容器会从新翻译jsp

2. jsp 是什么

实际上 jsp 就是 Servlet , 只是提供了一种比较直观的书写方式,由于写jsp就像在写Html

jsp中能够写 java 代码, 有两种写法

1) jsp 脚本表达式

内容会被放到 out.print() 里面 输出个浏览器

<%=new Date() %>

Jsp脚本表达式,等号后面跟一行java代码,注意不能以分号结束。

您的ip是:<%=request.getRemoteAddr() %>

面试题:

如何把一个数字转换成字符串?

String.valueof

Integer

String.valueof和to string有什么区别?

都是同样的。属于互相调用

2) jsp脚本片断

能够大量的写入java代码,输入多行java代码

Jsp脚本片断内容会原封不动地被翻译到 Servlet 的service方法中

<%

// java 代码

%>

Jsp运行原理:ie访问一个jsp时,web容器会将jsp首先翻译成一个servlet,余下的过程和访问一个servlet彻底同样。

表达式被翻译到service方法中的out.print

J

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代码,从域对象中取出数据)

2、 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 导包, 导入多个包时须要以“,”隔开 也能够分做多条指令书写

例如:<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

在这里自动导包的方法时,在单词的后面,点击alt+/,而后选择导包

就ok了

2) session 说明是否使用session

默认值为true,被翻译的Serlvet中会自动得到Session 
若是将该值指定为false 被翻译的Servlet的service方法中将不获取session

3) errorPage 指定错误跳转的页面

在 web.xml 文件中一样能够配置错误页面

可根据异常类型或错误编码进行配置

1.抓异常错误的

<error-page>

<exception-type>java.lang.ArithmeticException </exception-type>

<location>/error.jsp</location>

</error-page>

1. 错误码

<error-page>

<error-code>404</error-code>

<location>404.jsp</location>

</error-page>

*isErrorPage:true|false。指示是否是错误处理页面。是否产生exception对象

*contentType="mimeType;charset=UTF-8":等同于response.setContentType();

*pageEncoding:通知引擎在翻译jsp--》Servlet时使用的编码

*isELIgnored:是否忽略EL表达式true|false。默认值false。true是忽略EL表达式

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程序存在有与Servlet程序彻底相同的中文乱码问题

输出响应正文时出现的中文乱码问题 contentType=“text/html;charset=UTF-8”

二、读取浏览器传递的参数信息时出现的中文乱码问题

三、JSP引擎将JSP页面翻译成Servlet源文件时也可能致使中文乱码问题

JSP引擎将JSP源文件翻译成的Servlet源文件默认采用ISO8859-1编码,而JSP开发人员能够采用各类字符集编码来编写JSP源文件,所以,JSP引擎将JSP源文件翻译成Servlet源文件时,须要进行字符编码转换。

若是JSP文件中没有说明它采用的字符集编码,JSP引擎将把它看成默认的ISO8859-1字符集编码处理。

四、如何解决JSP引擎翻译JSP页面时的中文乱码问题

经过page指令的contentType属性说明JSP源文件的字符集编码

page指令的pageEncoding属性说明JSP源文件的字符集编码

通知客户端编码方式为contentType

3、 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() 将数据刷新

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()

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

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

page : PageContext对象

request : HttpServletRequest对象

session : HttpSession对象

application : ServletContext对象

class Request {

private Map<String, Object> 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);

}

}

 

因此在jsp中不要调用 getOutputStream()

固然也不方便作文件下载

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

 

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

5、 jsp 细节

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

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

Jsp注释:

1.sp 出错

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

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

此时会进一步报告致使异常的缘由,在Servlet中的哪行出现异常

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

6、内省(neixing)

1. javabean

固定写法的java类

1)必须有无参构造函数

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

3)提供标准的getter和setter

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

2. 什么是内省

内省: 经过反射的方式访问javabean

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

3.BeanUtils工具包

Apache组织开发了一套用于操做JavaBean的API(内省)

核心类 BeanUtils

setProperty(bean, name, value)

copyProperties(target, source);

能够支持String到8中基本数据类型转换

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

3. WebUtils 工具类

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

重点:

1. jsp运行原理(会被翻译成servlet)

2. jsp脚本表达式和脚本片断

3. jsp九大隐式对象

4. web开发的四个域对象

5. 内省

beanUtils工具的使用

使用

7、 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和pageEncoding能够冲突

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

8、web开发模式

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

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

Model2: servlet+jsp+javabean mvc

-------------------------------------------------------------------------------

Jsp的一些经常使用功能:

1.您的ip是:<%=request.getRemoteAddr() %>

2.滚动功能:<marquee behavior="scroll" direction="left"> </marquee>

使用<div>的功能,ap元素。

相关文章
相关标签/搜索