1、jsp简介
1)JSP全称是Java Server Pages,它和Servlet技术一样,都是sun公司定义的一种用于开发动态web页面(资源)的技术
2)写jsp虽然就像是在写html,但jsp技术允许在页面中编写java代码,并且允许开发人员在页面中获取request、response等web开发常用对象,实现与浏览器的交互,所以jsp也是一种动态web资源开发技术
3)Jsp最佳实践:
__1不管jsp还是servlet,虽然都可以用于开发动态web资源。但由于这两门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把jsp技术作为数据显示模板来使用。
__2其原因为,程序的数据通常要美化后再输出:
让jsp既用java代码产生动态数据,又做美化会导致页面难以维护;让servlet即产生数据,又在里面嵌套html代码美化数据,同样会导致程序的可读性差,难以维护;最好的办法就是根据这两门技术的特点,让他们各自负责各的,servlet只负责响应请求产生的数据,并把数据通过转发技术带给JSP,数据的显示jsp来做
2、jsp语法一
1)Jsp模板元素:jsp页面中的HTML内容称之为JSP模板元素;JSp模板元素定义了网页的基本骨架,即定义了页面的结构和外观。
2)jsp脚本表达式(espression)
__1用于将程序数据输出到客户端
语法:<%= 变量或者表达式 %>
举例:当前时间<%= new java.util.Date() %>
__2jsp引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应的位置用out.print(…)将数据输给客户端;
__3jsp脚本表达式中的变量或表达式后面不能有分号;
3)jsp脚本片段(scriptlet)
__1用于在jsp页面中编写多行代码
语法:<% 多行java代码 %>
__2注意:jsp脚本判断中只能出现java代码,不能出现其他模板元素,jsp引擎在翻译jsp页面时,会将jsp脚本片段中的java代码原封不动地放到Servlet的_jspService方法中
__3jsp脚本片段中的java代码必须严格遵循java语法,例如:每执行语句后面必须用分号结束
__4在一个jsp页面中可以有多个脚本片段,在两个或多个脚本片段之间可以嵌入文本、HTML标记和其他jsp元素
__4多个脚本片段中的代码可以相互访问,犹如将所有的代码放在一堆<%%>之中的情况
__5单个脚本片段中的java语句可以是不完整的,但是多个脚本片段组合后的结果必须是完整的java语句。例如:for循环
4)jsp声明
__1jsp页面中编写的所有代码,默认会翻译到servlet的service方法中,而jsp声明中的java代码会被翻译到_jspSevice方法的外面:语法<%! java代码 %>
__2所以,jsp声明可用于定义jsp页面转换成的Servlet程序的静态代码块、成员变量和方法;
__3多个静态代码块、变量和函数可以定义在一个jsp声明中,也可以分别单独定义在多个jsp声明中
__4jsp隐式对象的作用仅限于Servlet的_jspService方法,所以在jsp声明中不能使用这些隐式对象
__5如果让jsp拥有自己的方法,可以考虑在该声明中加入方法的代码,这样就可以在service方法外声明一个自己的方法,但是这样的方式基本没人使用。面试题:如果在该代码块中声明了与jsp翻译后的servlet拥有同样的方法,会覆盖jsp翻译后的方法
5)jsp注释,语法:<%– 注释信息 –%>
__1jsp引擎在将jsp页面翻译成Servlet程序时,忽略jsp页面中被注释的内容
__2若使用html页面注释()java代码,则会发生服务器将注释发送给浏览器的情况,虽然显示相同
3、jsp语法二
1)jsp指令(directive)是为jsp引擎而设计的,他们并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面中的其余部分。在jsp2.0规范中共定义了三个指令:page指令,include指令、taglib指令
2)jsp指令基本语法格式:<%@ 指令 属性名=”值” %>;如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写
3)page指令:
用于定义jsp页面的各种属性,无论page指令出现在jsp页面的什么地方,它作用的都是整个jsp页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个jsp页面的起始位置
4)
<%@ page
[language="java"]//告诉服务器嵌入的是什么语言
[entends="package.class"]//Servlet继承谁(一般不需要改,默认即可)
[import="{package.class|package.*},...]//导入所需要的包
1-jsp引擎自动导入的包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
2-可以在一条page指令的import属性引入多个类或包
其中每个包和类使用逗号分隔:
<%@ page import="java.util.Date,java.sql.*,java.io.*"%>
[session="true|false"]//置为true,在jsp中翻译为servlet会自动创建session对象
即session只有置为true时才可以直接使用session关键字,默认为true
[buffer="none|8kb|sizekb]//默认为8kb,即PrintWriter的缓冲
[isThreadSafe="true|false"]//默认true,设为false是继承SingleThreadModel
[info="text"]//可以通过info属性带点信息
[errorPage="relative_url"]//设置jsp页面错误处理页面
1-errorPage属性的设置必须使用相对路径,如果以“/”开头,
表示相对于当前web应用程序的根目录(注意不是站点根目录)
否则,表示相对于当前页面
2-可以在web.xml文件中使用<error-page>元素(在web-app元素下配置)
为整个web应用程序设置错误处理页面
其中1: <exception-type>子元素指定异常类的完全限定名
<location>元素指定以"/"开头的错误处理页面的路径
2: <error-code>状态码,如:404
<location>元素指定以"/"开头的错误处理页面的路径
错误页面大小最好要超过1K,否则不会出现实验效果
3-如果设置了某个jsp页面的errorPage属性,
那么在web.xml文件中设置的错误处理将不对该页面起作用
[isErrorPage="true|false"]//默认false
置为true后,翻译为servlet后会把异常对象传递到错误页面翻译成的servlet
即会在servlet中声明exception,置为false只有八大对象
[contentType="mimeType[;charset=characterSet]"|"test/html;charset=ISO-8859-1"]
//告诉服务器页面什么类型
[pageEncoding="characterSet|ISO-8859-1"]//也是解决乱码的,后面会继续讲解
[isELIgnored="true|false"]//是否忽略EL(jsp2.0特有)表达式,默认false
%>
5)使用page指令解决jsp中文乱码
__1jsp程序存在有与Servlet程序完全相同的中文乱码问题
输出响应正文时出现的中文乱码问题
读取浏览器传递的参数信息时出现的中文乱码问题
__2jsp引擎将jsp页面翻译成Servlet源文件时也可能导致中文乱码
1-jsp引擎将jsp源文件翻译成的Servlet源文件默认采用UTF-8编码
而jsp开发人员可以采用各种字符集开编写jsp源文件
因此,jsp引擎将jsp源文件翻译成Servlet源文件时,需要进行字符编码转换。
2-如果jsp文件中没有说明它采用的字符集编码
jsp引擎将把它当做默认的iso8859-1字符集编码处理
__3如何解决jsp引擎翻译jsp页面时的中文乱码问题
1-通过page指令的contentType属性说明jsp源文件的字符集编码
2-page指令通过pageEncoding属性说明jsp源文件的字符集编码
__4见jsp乱码根由.jsp。即pageEncoding属性告诉服务器以什么码表来翻译成servlet;contentType属性控制浏览器以什么方式打开;在eclipse下比较智能,改变pageEncoding,eclipse会直接按其属性值码表保存;其实如果写了pageEncoding,contentType可以不写,服务器自动会自动在response上加上contentType;总结一句话,jsp以什么码表保存,就要通过pageEncoding通知服务器以什么码表翻译成Servlet
6)include指令
__1用于引入其他jsp页面,如果使用include指令引入了其他jsp页面,那么jsp引擎将把这两个jsp翻译成一个servlet。所以include指令引入也称之为静态引入。语法:<%@ include file=”relaticeURL” %>,其中file属性用于指定被引入文件的路径,路径以“/”开头,表示当前web应用
__2细节
被引入的文件必须遵循jsp语法
被引入的文件可以使用任意的扩展名,即使其扩展名是html,jsp引擎也会按照处理jsp页面的方式处理它里面的内容,为了见名知意,jsp规范建议使用.jspf(jsp fragments碎片)作为静态引入文件的扩展名
由于使用include指令将会涉及到2个jsp页面,并会把2个jsp翻译成一个servlet,所以这2个jsp页面的指令不能冲突(除了pageEncoding和导包除外)
__3注意:
包含会把所有代码(除了指令)包含进jsp页面(此种方式为静态包含(编译时包含),会将jsp页面全部翻译成一个servlet)
__4区分:
request.getRequestDispatcher(“”).include(request,response);
//动态包含(运行时包含),生成不同的Servlet,运行时包含
//开发中尽量使用静态包含(性能会较好)
7)taglib指令
Taglib指令用于在jsp页面中导入标签库,讲自定义标签技术时讲
4、jsp语法三
1)Jsp运行原理和九大隐式对象
__1每个jsp页面在第一次被访问时,web容器都会把请求交给jsp引擎(即一个java程序)去处理。jsp引擎先将jsp翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方式进行调用
__2由于jsp第一次访问时会翻译成servlet,所以第一次访问通常比较慢,但第二次访问,jsp引擎如果发现jsp没有变化,就不在翻译,而是直接调用,所以程序的执行效率不会受到影响。
__3jsp引擎在调用jsp对应的_jspServlet时,会传递或创建9个与开发相关的对象供_jspServlet使用。Jsp技术的设计者为便于开发人员在编写jsp页面时获得这些web对象的引用,特意定义了9个响应的变量,开发人员在jsp页面中通过这些变量就可以快速获得这9个对象的引用
__4这九个对象分别是哪些,以及作用也是笔试经常考察的知识点
Request
Response
Session//session设置为false不声明
Application//servletContext
Config//servletConfig
Page//this
Exception//需要设置isErrorPage为true
Out
pageContext
2)Out隐式对象
__1用于向客户端发送文本数据
__2是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常类似
__3jsp页面中的out隐式对象的类型为JspWriter,相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整他的缓存大小,甚至关闭他的缓存
__4只有向out对象写入了内容,且满足如下任何一个条件时,out对象才会去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的response缓冲区中,见out隐式对象的工作原理图:
设置page指令的buffer属性关闭了out对象的缓存功能
out对象的缓冲区已满
整个jsp页面结束
案例: out.write(“bbbbbb”);
response.getWriter().write(“aaaaa”);//输出结果aaaaabbbbbb
3)pageContext对象
__1是jsp技术中最重要的一个对象,它代表jsp页面的运行环境
这个对象不仅封装对其他8大隐式对象的引用
他自身还是一个域对象,可以用来保存数据
并且这个对象还封装了web开发中经常涉及到的一些常用操作
例如:引入和跳转其他资源,检索其他域对象中的属性等
__2 getException方法返回exception隐式对象
getPage//page
getRequest//request
getResponse//response
getServletConfig//config
getServletContext//application
getSession//session
getOut//out
__3格式良好的jsp页面不允许出现一行java代码,当出现java代码时,使用自定义标签技术,需要定义额外的一个类,所以此时通过一个pageContext对象即可将对象全部传到该类中。所以定义了这样的一个pageContext
__4pageContext生命周期是Jsp页面产生,jsp页面结束死亡,page域,比其他三个域都小
pageContext对象的方法
setAttribute
getAttribute
removeAttribute
还封装了访问其他域的方法
getAttribute
setAttribute
removeAttribute
代表各个域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法 //查找顺序:page、request、session、application
__5引入和跳转到其他资源
pageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法。方法接收的资源如果以“/”开头,其代表当前web应用
5、jsp语法四
1)jsp标签也称之为Jsp Action(jsp动作)元素,它用于在jsp页面中提供业务逻辑功能,避免在jsp页面中直接编写java代码,造成jsp页面难以维护
2)//常用于网站配置首页,xml文件中配置首页不允许配置servlet,配置servlet无效,但是可以通多jsp页面做首页然后跳转到servlet
该标签用于把请求转发给另外一个资源。
” />
page属性用于指定请求转发到的资源的相对路径,它可以通过执行一个表达式来获得
3)//<%– pageContext.include() 动态包含 –%>用的不多
该标签用于把另外一个资源的输出内容插入进当前jsp页面的输出内容之中,这种在jsp页面执行时的引入方式称之为动态引入。
语法:
<jsp:forward page="">
<jsp:param name="username" value="xxx"/>
</jsp:forward>
当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。
语法:<jsp:param name="parameterName" value="parameterValue|<%=expression%>"/>
name属性用于指定参数名,value属性用于指定参数值。
在include和forward标签中可以使用多个param标签传递多个参数
6、jsp映射
web.xml文件中
<servlet>
<servlet-name>xxx</servlet-name>
<jsp-file>fileURL</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>URL</url-pattern>
</servlet-mapping>
7、如何查找jsp页面中的错误
1)jsp页面中的jsp语法格式问题,导致其不能被翻译成Servlet源文件,jsp引擎将提示这类错误信息发生jsp页面中的位置(行和列)以及相关信息。
2)jsp页面中的jsp语法格式没有问题,但是被翻译成的Servlet源文件中出现了问题,导致jsp页面翻译成的Servlet不能通过编译,jsp引擎也将提示这类错误发生在jsp页面中的位置(行和列)以及相关信息
3)jsp页面翻译成的Servlet程序在运行时出现异常,这与普通的java程序的运行时的错误完全一样,java虚拟机将提示错误发生在Servlet源文件中的位置(行和列)以及相关信息。

2349

被折叠的 条评论
为什么被折叠?



