jsp总结

 

回顾:

javaScript的这个页面它是往html里面进行嵌套的,依赖于html, 单独运行js文件,你肯定运行不了

 

所有的东西都是往服务器上搭, tomcat就是一个平台,可以接收好多的项目,可以去加载,访问的时候就去服务器里面找,看有没有该项目

jsp就是servlet, 只不过一个是图形化的,一个是代码的

所谓javaweb指的就是动态web资源的开发

 

 

常见Web服务器中Tomcat最小.它只支持Servlet/JSP规范.

 

Tomcat是在SUN公司推出的小型Servlet/JSP调试工具的基础上发展起来的一个优秀的Servlet容器.

Servlet容器是用来装请求的.Tomcat本身完全用Java语言编写.

 

 

 

什么是servlet?

servlet是运行在web服务器中的小型Java程序(即:服务器端的小应用程序). servlet通常通过HTTP(超文本传输协议)接收和响应来自客户端的请求.

 

 

html, xml ,jsp 页面的标签属性值必须用引号引起来。单双引号都行

这也说明了为什么在servlet中可以这样写

out.print("\t\t姓名:<input type=\"text\" name=\"name\"><br/>\r\n");

out.print("<a href='https://www.baidu.com'>点我<a>");

 

 

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("登录成功");
		out.print("\t\t姓名:<input type=\"text\" name=\"name\"><br/>\r\n");
		out.print("点击跳转\r\n");
		out.print("<a href='https://www.baidu.com'>点我<a>");
		
	}


点访问该servlet时,浏览器上可以看到返回给客户端的html文本

 



jsp注释<%-- --%> 和 <!-- -->的区别:

用 <%-- --%> 进行注释的时候,会在服务器端也进行注释,在解析的时候会解析不到注释的部分,而注释掉的代码,通过浏览器查看源码(F12)时也是不可见的。
用 <!-- --> 注释jsp代码只是在客户端进行注释,在加载的时候,仍然会被服务器端进行解析,当解析不到的时候,就会在浏览器端报错,且注释掉的代码,通过浏览器查看源码时 是可以看见的。

如图:
success.jsp页面 <body>标签下代码为:

<body>
	Success!
	
	<!-- 12345 -->
	<!-- ${1+1} -->             // 这个经过加载解析之后,会被解析为<!--2-->
	<%--${1+1} --%>             // 这个经过加载解析之后,不会发生变化
	<%-- <%= %> --%>
</body>

通过浏览器访问success.jsp页面,结果如下:

通过上面实际操作,发现对于jsp中 <%-- <%= %> --%> 这样的注释,在服务器端jsp加载后注释部分不会被解析。
如果换成 <!-- <%= %> --> 这样的注释,则就会在浏览器端报500了。如图:



一、 jsp入门

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

JSP 全名为 java server pages ,中文名叫 java服务器页面, 其根本是一个简化的Servlet设计.

JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm, *.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成jsp文件,后缀名为(.jsp).

用JSP开发的Web应用是跨平台的, 即能在Linux下运行,也能在其他操作系统上运行, JSP与Servlet一样,是在服务器端执行的,通常返回给客户端的就是

一个HTML文本, 因此客户端只要有浏览器就能浏览.

 

 

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,生成的Servlet会被放到

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

注意:

若你的tomcat配置在Eclipse的Server中了,则在Eclipse中运行tomcat后,工程的jsp文件被编译成servlet文件后,不是放在tomcat中,

而是放在Eclipse的workspace目录的 .metadata目录下.

我的工程中的JSP文件被编译后就放在

workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\工程名\org\apache\jsp\路径下

 

   第二次访问jsp的时候如果jsp没有任何的改动,

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

 

2. jsp是什么

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

 

jsp中可以写 java代码,有两种写法

1) jsp(输出)表达式

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

 

<%=new Date() %>

 

 

 

 

 

2) jsp脚本

jsp脚本里可以包含任何想执行的java代码,内容会原封不动地被翻译到 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被翻译的Servlet的service方法中将不获取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页面的九个内置对象,并加以说明

 

 

对象名

类型

说明

request

javax.servlet.http.HttpServletRequest

 

response

javax.servlet.http.HttpServletResponse

 

session

javax.servlet.http.HttpSession

由session="true"开关

application

javax.servlet.ServletContext

 

exception

java.lang.Throwable

由isErrorPage="false"开关

page

java.lang.Object当前对象this

当前servlet实例

config

javax.servlet.ServletConfig

 

out

 javax.servlet.jsp.JspWriter

字符输出流,相当于 printWriter对象

pageContext

 javax.servlet.jsp.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()

 

 

 

四、jsp的6个动作

 使用标签的形式来表示一段java代码。

如:

<jsp:include page="header.jsp"></jsp:include>

 

<jsp:include > 动态包含

<jsp:forward> 请求转发

<jsp:param> 设置请求参数

<jsp:useBean> 创建一个对象

<jsp:setProperty> 给指定的对象属性赋值

<jsp:getProperty> 取出指定对象的属性值

 

 

 

 

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

范围由小到大: page(jsp有效) 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)提供标准的getter和setter

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

   

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

   BeanUtils

   setProperty(bean, name, value)

   copyProperties(target, source);

   可以支持String到8中基本数据类型转换

   其他引用数据类型都需要注册转换器 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>获得属性值

 

 

 

 

九、jsp的3个指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

在JSP 2.0规范中共定义了三个指令:

page指令

Include指令

taglib指令

语法:

<%@ 指令名称 属性1=属性值1属性2=属性值2。。。%>

或者:

<%@ 指令名称 属性1=属性值1%>

<%@ 指令名称 属性2=属性值2%>

如:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ page language="java" %>

<%@ page import="java.util.*" %>

1、page:

作用:用于定义JSP页面的各种属性

属性:

1.1、 import 和java代码中的import是一样的

<%@ page import="java.util.Date,java.util.List"%>

或者:

<%@ page import="java.util.Date"%>

<%@ page import="java.util.List"%>

JSP会自动导入以下的包:

import java.lang.*;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

1.2、 session: 是否会自动创建session对象。默认值是true;---默认有session属性

1.3、 buffer:JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb.

1.4 errorPage: 如果页面中有错误,则跳转到指定的资源。

errorPage="/uri" 如果写/则代表当前应用的目录下,绝对路径。

如果不写/则代表相对路径。

    1.5、 isErrorPage: 是否创建throwable对象。默认是false; 只有设置为true时才会创建

1.6、 contextType: 等同于response.setContextType("text/html;charset=utf-8");

1.7、 pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。

1.8、 isELIgnored: 是否支持EL表达式。 默认是false

<%@ page  pageEncoding="gbk" %>

2、include:

静态包含:把其它资源包含到当前页面中。

<%@ include file="/include/header.jsp" %>

动态包含:

<jsp:include page="/include/header.jsp"></jsp:include>

两者的区别:翻译的时间段不同

前者:在翻译时就把两个文件合并

后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

原则:能用静的就不用动的。

3、taglib

作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 

 

 

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值