JavaWeb——JSP基础

来源:互联网 发布:python 函数参数传递 编辑:程序博客网 时间:2024/06/01 10:32

JSP基础


本文总结JavaEE中JSP技术的脚本4种脚本插入方式, 3种标签指令, 9个隐式对象,及对JSP页面内JavaBean的useBean,getProperty,setProperty的使用


1. 什么是JSP, JSP技术是未解决什么问题而加入的?

a. JSP是JavaServer Pageb. JSP出现是为了解决Servlet在输出HTML上的不足c. 所以JSP技术需要得到输出HTML变得更容易, 阅读和维护HTML变得容易


2. JSP是如何解决Servlet输出和维护HTML的不方便的?

a. JSP选择用常规的HTML语言作为基本页面语言b. JSP容许以标签的形式在HTML语言的页面中插入servlet codec. JSP自动将page转化成一个servlet(只转一次), 之后这个servlet实现于其他servlet, JSP的交互


3. JSP这样做的好处是什么?

a. JSP可以用现成的HTML制作工具书写b. 可以有专门做HTML的人负责页面显示的制作, 专门的人去分工做Java Programmingc. JSP的使用可以劲量地分开控制性的JavaCode和显示性的HTMLCode


4. JSP技术和同类技术比较优势在哪里?

a. JSP vs ASP or ColdFusion: 更好的动态部分; 适合多种服务器和操作系统b. JSP vs PHP: 更好的动态部分; 更好的工具支持c. JSP vs client-side JavaScript: 功能基本不重叠,一个在服务端一个在客户端d. JSP vs server-side JavaScript: 语言更丰富e. JSP vs static HTML: 动态特性* JSP的替代技术是JSF 2: JSF2 支持 Ajax; field validation; page templating; 丰富的第三方工具库等等 


5. 如何建立一个JSP, 如何在JSP中插入Java Code?

a. 建立一个JSP, 无需设置CLASSPATH, 无需编译代码, 无需包名, 无需特殊的指定目录, 无需特殊的URI设定b. 就像建立一个HTML页面一样建立一个JSP, 就像设置一个HTML的URL一样设置JSP的URL, 如果是用Eclipse工具还是放在WebRoot的目录以下c. 插入JavaCode的脚本方式有: Expressions | Scriptlets | Declarations | XML syntaxc.1 JSP Expressions : <%= Java Expression%> : - 结果被以String的样式输出代替HTML页面的部分内容, 注意不可以有";"- servlet中被翻译成 out.println(Java Expression); 也解释了为什么Expression不能带";"- XML synax: <jsp:expression> Java Expression</jsp:expression>c.2 JSP Scriptlets : <%  Java Code  %> 得到的- 结果不会输出在页面中, 而存在在JSP被转成的servlet的变量中, 如果要结果需要用JSP Expression去获取这些变量- servlet中被直接翻译成 <%%>内的代码-XML synax: <jsp:scriptlet>Java Code</jsp:scirptlet>c.3 JSP Declarations: <%! Java Code%>- 结果被直接插入servlet的类里面, 用来声明成员变量/成员方法/静态代码块- <%! private int someFiled=5;%> 比较有用- <%! private void someMethod(){}%> 推荐被定义在一个单独的Java 工具类里面- XML synax: <jsp:declaration>Java Code</jsp:declaration>c.4 JSP XML synax表达式是XML规范下的JSP书写格式- 完全满足xml书写规范的JSP文件用.jspx以解析- 调用JSP XML synax标签: 需要导入xmlns: jsp="http://java.sun.com/JSP/Page"- 特别适用于: Web Services; Ajax Applications


6. JSP Scripting 标签的一些翻译细节:

a. 最重要的一点是: JSP要被自动翻译成一个Servlet, 所以一些JSP Scripting的语法的理解都要通过转化后的Servlet来理解b. 中的所有HTML标签及内部文本在servlet中都被翻译out.print(xxx); c. JSP Expressions在 servlet中也被翻译成out.print(expression的String表现形式);d. JSP Scriptlets在servlet中被原封不动地翻译了过去, 内部定义的变量和方法都不受<%%>的范围限定, <%%>只是限定了一种翻译的标准e. 同理, Scriptlets中的JavaCode甚至不必是一个完整的JavaCode, 这样的好处是可以方便在一些JavaCode的语句中直接嵌入带有HTML样式的输出语句
<% for(String name:names){%>           Candidate: <B><%=name%></B> <br/><%}%>
f. JSP Defination特别地声明了一些servlet class的成员变量或方法 <%! %>只是一种翻译类型的标志 g. 注意: b, c, d中的语句被翻译到service/doGet/doPost之中, 而 作为声明的 f 则是作为这个Servlet的成员变量和方法


7. JSP 中的9个隐式对象

a. JSP 一共有9个隐式对象, 这些对象无需创建即可适用, 而且有固定的使用名称        a.1 获取代表4个域的对象:         - application:      ServletContex- session:      HttpSession- request :      HttpServletRequest- pageContext :      PageContexta.2 获取和request对应的response对象- response:   HttpServletResponsea.3 获取表示当前JSP Servlet的 this对象 page- page:_JSPServlet ---> thisa.4 获取错误信息对象exception- exception:Throwablea.5 获取servlet的配置信息对象config- config:ServletConfiga.6 获取输出信息对象out- out:JspWriterb. JspWriter:out对象的一些细节b.1 JspWriter 是一个 response.getWriter()的一个包装类BufferedWriterb.2 JspWriter 带有缓冲区: 写入需要的条件是缓冲区满了或者调用flushb.3 JspWriter的缓冲区默认是8kbb.4 Jsp中尽量用out做输出b.5 Jsp中不用做下载: out和 response.getOutputStream()不可同时用c. pageContext的一些细节c.1 通过pageContent可以得到其他8个隐式对象,所以pageContext一个重要特性就是在Jsp之外对Jsp的一些隐式对象进行调用c.2 通过再Java函数中传入pageContext对象, 可以实现外部java代码和Jsp文件的交互c.3 在标签技术中,甚至可以在标签中缺省pageContext的传入, 标签技术也把pageContext作为隐式对象c.4 pageContext是servlet默认给出的范围最小的域对象, 可以set/get/findAttributec.5 findAttribute和getAttribute的区别是:    - get只在本域中找    - find如果在本域中找不到,会自动到范围更广的域中查找d. page的一些细节d.1 page代表jsp翻译好的_JspServlet对象,也就是默认的thise. session的一些细节e.1 session默认是存在在_JspServlet中的,但是session不一定会被用到e.2 所以可以在JSP中设置 session="false", 此时, 翻译的Jsp中不会含有session隐式对象, 可以节省内存空间f.exception的一些细节f.1 exception是为了处理错误信息才存在的页面f.2 出错跳转的页面需要被设置成isErrorPage=“truef.3 当错误页面接受到了相应的exception时,才会在这个jsp页面中自动生成这个隐式对象exception 


8. Page Directive——定义JSP和相应JSPServlet页面间的翻译标准

a. 导入什么样的Java工具类或帮助类:<%@ page import="java.util.*,coreservlets.*"%> b. jsp编码形式:<%@ page pageEncoding="utf-8" %>c. 是否被包含在一个session中<%@ page session="false" %>d. 设置out的缓冲区容积<%@ page buffer="18kb" %>e. 设定一个关联的错误显示页面<%@ page errorPage="/pages/error.jsp" %>f. 标示一个jsp是错误显示页面<%@ page isErrorPage="true" %>g. 除了e,f还可以在web.xml文件中定义<error-page>(exception-type | errorCode, location)g.1 exception-type标示catch何种异常g.2 error-code标示catch何种error-codeg.3 location标示出现g.1 g.2时调转到的位置


9. Include Directive 和 Taglib Directive

a. include可以向jsp中添加一个file/applet
- <%@ include file="/pages/example.jsp" %>
b. <%@ include file=".jsp" %> 和 <% jsp:include page=".jsp" %>的区别是
- 前者是将一个file导入到这个jsp中,会生成一个.java的servlet,融合显示到一个html中
 - 后者是jsp标签的include:相当于 request.getRequestDispatcher("/xxx").include(request,response)
- 后者会产生两个.java的servlet
- 用前者时,由于是被融合显示到一个html,要注意两个file Page Directive是否相容
- 一般前者被include的jsp不加任何html标签,因为包含的jsp中已经包括了一些基本html标签
c. taglib 可以向jsp中添加一个标签库
- <%@ include  prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
- prefix:xmlns的名称
- uri:taglib的虚拟地址


10. 在JSP中使用JavaBean

a. 在jsp内初始化一个JavaBean:<jsp:useBean id="MyBean" class="Package.Class" />
b. 在jsp内为一个JavaBean的Property赋值
b.1 通过value直接赋值:<jsp:setProperty name="MyBean" property="prop" value="xxx" />b.2 通过param间接复制:<jsp:setProperty name="MyBean" property="prop" param="prop" />b.3 通过*全部间接复制:<jsp:setProperty name="MyBean" property="*" />b.4 通过param/*赋值适用于表单提交 c. 在jsp内得到一个JavaBean的Property<jsp:getProperty name="MyBean" property="prop" />d. 设置一个JavaBean可以存在的域范围<jsp:useBean id="MyBean" class="Package.Class" scope="xxx" />d.1 scope="page":默认值, bean只会在 PageContext对象内存在,id="MyBean"只在当前页面请求有效d.2 scope="request":在request的included的页面/forward的页面可以共享 ”MyBean“,但只在一次请求内有效d.3 scope="session":在一个session内可以共享 ”MyBean",过后访问依然有效d.4 scope="application":在一个application内都有效, 即其他的用户也可以访问到 “MyBean里面的信息e. 在Jsp页面内用jsp标签创建并调用JavaBean需要注意e.1 从表单得到的参数信息都是String类的,但是jsp中创建并调用的JavaBean中的Property信息可以是多种多样的e.2 对于e.1, 用param为setProperty赋值的方法却不只是可以String类型的JavaBean的Property,因为其标签内部调用BeanUtilse.3 表单提交的property可能存在两种特殊情况: 空字符Property 或者 没有提交这个属性e.4 对于e.2, 用于表单提交的JavaBean 需要在Java Code中加上
e.4.a 一个判断isEmpty(String) 用以判断将要赋值的元素是否为 null 或 ”“ e.4.b 每个setXxx(String xxx)函数在赋值前先判断 if(isEmpty(xxx)),不为空再赋值e.4.c 为每个属性赋予一个默认值, 如果这个属性为空, 则用这个默认值e.4.d 将自定义的JavaBean implements Serializable 以便可以长久保持f. <jsp:useBean ...><jsp:setProperty ...></jsp:useBean> 与 <jsp:useBean />+<jsp:setProperty >的区别f.1 两种都只在首次用到此id的JavaBean时才创建userBean对象,如果发现此对象已经存在,则只是调用
 f.2 同理,当发现前者的JavaBean在内存中时,内部语句即被跳过,setProperty也只是在首次创建对象时运行
f.3 而对于后者,不会有f.2的问题,每次都执行
public class MyBean implements Serializable{    // e.4.d       private boolean isEmpty(String value){            return (value==null) || (value.equals("");    // e.4.a       }       public void setXxx(String xxx){            if(!isEmpty(xxx)){this.xxx=xxx;}    // e.4.b       }       private String xxx="xxxDefaultValue";      // e.4.c}


参考资料:

[1] Coreservlet Intermediate Servlet&JSP, http://courses.coreservlets.com/Course-Materials/csajsp2.html 

[2] 传智博客徐文海JavaWeb讲义

原创粉丝点击