Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 824|回复: 0

JSP技术(入门教程)

[复制链接]

该用户从未签到

发表于 2011-7-31 22:05:20 | 显示全部楼层 |阅读模式




一.JSP技术
1.Tip:什么是JSP?
JSP全称是java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

JSP这门技术的最大的特点在于,写jsp就像在写HTML,但它比拟html而言,html只能为用户提供静态内容,而Jsp技术答应在页面中嵌套java代码,为用户提供动态数据

*Jsp快速入门:在jsp页面中输出当前时间。

<html>
  <head>
    <title>jsp入门</title>
  </head>
  <body>
   <font>
   <%  想回应中写入当前时间
     response.getWriter().write("当前时间:");
     Date date = new Date();
     String str = date.toLocaleString();  获取本地时间格局
     response.getWriter().write(str);
   %>
    </font>  
  </body>
</html>



二.Tip:JSP最佳实践
无论是JSP仍是Servlet,固然都可以用于开发动态web资源。但因为这2门技术各自的特点,在长期的软件实践中,
人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

其原由于,程序的数据通常要美化后再输出:
让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护
因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应哀求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。
三.Tip:JSP原理
Web服务器是如何调用并执行一个jsp页面的?


Jsp页面中的html排版标签是如何被发送到客户真个?

Jsp页面中的java代码服务器是如何执行的?

Web服务器在调用jsp时,会给jsp提供一些什么java对象?


Tip:JSP语法
1.JSP模版元素

JSP页面中的HTML内容称之为JSP模版元素
JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

2.JSP表达式


JSP脚本表达式(expression)用于将程序数据输出到客户端
语法:<%=变量或表达式 %>
举例:当前时间:<%= new java.util.Date() %>
JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
JSP脚本表达式中的变量或表达式后面不能有分号(;)


3.JSP脚本片段
JSP脚本片段(scriptlet)用于在JSP页面中编写多行Java代码。语法:
<%
  多行java代码
%>
留意:JSP脚本片段中只能泛起java代码,不能泛起其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片段中的Java代码将被原封不动地放到Servlet的_jspService方法中。
JSP脚本片段中的Java代码必需严格遵循Java语法,例如,每执行语句后面必需用分号(;)结束。
在一个JSP页面中可以有多个脚本片段,在两个或多个脚本片段之间可以嵌入文本、HTML标记和其他JSP元素。
举例:
<%
int x = 10;
out.println(x);
%>
<p>这是JSP页面文本</p>
<%
int y = 20;
out.println(x);
%>
多个脚本片段中的代码可以相互访问,如同将所有的代码放在一对<%%>之中的情况。如:out.println(x);
单个脚本片段中的Java语句可以是不完整的,但是,多个脚本片段组合后的结果必需是完整的Java语句,例如:

表达式和脚本片断综合实例

<body>
   当前时间:
    <%    获得当前本地格局时间
     Date date = new Date();
     String str = date.toLocaleString();
    %>   //向浏览器输出,相称于注释中的命令
   <%=str %>  <!-- out.print(str) -->
    <%   一共输出5次
     for(int i=0;i<5;i++)
     {
    %>
      
www.itcast.cn
    <%
     }
    %>   
  </body>


4.JSP声明
JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
<%!
java代码
%>

所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法。

多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。

JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

实例

<%!
    public void xx(){
     System.out.println("hhaha");
    }
   
    private static String xx = "aaa";
   
    static{
     System.out.println("wowoowowo!!!");
    }
   %>


5.JSP注释

JSP注释的格局:
  <%-- 注释信息 --%>
JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容
实例

<body>
   jsp注释 直接忽视不会被翻译
   <%--
   aaaaaaaaaaa
    --%>
   
    html注释   固然注释但是依旧翻译到_jspService
    <!--
    aaaaaaaaa
    -->
   //java代码只能采用jsp注释
    <%--
    <%
     int x = 0;
    %>
6.JSP指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部门。在JSP 2.0规范中共定义了三个指令
page指令
Include指令
taglib指令

JSP指令的基本语法格局:
<%@ 指令属性名="值" %>
举例:<%@ page contentType="text/html;charset=gb2312"%>
假如一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写
例如:
<%@ page contentType="text/html;charset=gb2312"%>
  <%@ page import="java.util.Date"%>

也可以写作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
page指令用于定义JSP页面的各种属性,不管page指令泛起在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

1)JSP 2.0规范中定义的page指令的完整语法:

<%@ page
[ language="java" ]  语言
[ extends="package.class" ]   实现的接口
[ import="{package.class | package.*}, ..." ]   

JSP引擎会自动导入默认包

java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*

可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔:
  <%@ page import="java.util.Date,java.sql.*,java.io.*"%>
上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:
  <%@ page import="java.util.Date"%>
  <%@ page import="java.sql.*"%>
  <%@ page import="java.io.*"%>

[ session="true | false" ]      
[ buffer="none | 8kb | sizekb" ]
[ false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relative_url" ]

errorPage属性的设置值必需使用相对路径,假如以“/”开头,表示相对于当前WEB应用程序的根目录(留意不是站点根目录),否则,表示相对于当前页面。
可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。
假如设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将分歧错误该页面起作用。
[ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]

JSP引擎会根据page指令的contentType属性天生相应的调用ServletResponse.setContentType方法的语句
page指令的contentType属性还具有说明JSP源文件的字符编码的作用
[ pageEncoding="characterSet | ISO-8859-1" ]
[ isELIgnored="true | false" ]
%>

page应用

Tip:使用page指令解决JSP中文乱码
JSP程序存在有与Servlet程序完全相同的中文乱码题目
输出响应正文时泛起的中文乱码题目
读取浏览器传递的参数信息时泛起的中文乱码题目
JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码题目
JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发职员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。
假如JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。
如何解决JSP引擎翻译JSP页面时的中文乱码题目
通过page指令的contentType属性说明JSP源文件的字符集编码
page指令的pageEncoding属性说明JSP源文件的字符集编码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
1.page指令的pageEncoding属性用于告诉jsp引擎以什么码表,把jsp翻译成servlet
2.page指令的contentType属性用于指定翻译后的servlet的response采用的码表




2)Tip: include指令
include指令用于引入其它JSP页面,假如使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
<%@ include file="relativeURL"%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
细节
被引入的文件必需遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
因为使用include指令将会涉及到2个JSP页面,并会把
2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

include实例(静态引入和动态引入)

<head>
    <title>include指令(静态包含)  留意:无论是静态、动态,被包含页面中不能泛起html全局架构标签</title>  静态引入的都是指定的应用存在硬盘上
  </head>
  <body>
    <
%@includefile="/public/head.jsp" %>
    xxxxxxxxxxxxxxx<br/>
    <
%@includefile="/public/foot.jsp" %>
  </body>




<head>
    <title>动态包含</title>
  </head>  
  <body>  动态引入的是从缓存中的哀求对象中获取
   <%
    request.getRequestDispatcher("/public/head.jsp").include(request,response);
   %>
     xxxxxxxxxxxxxxx<br/>
   <%
    request.getRequestDispatcher("/public/foot.jsp").include(request,response);
   %>
  </body>


3)Tip: taglib指令
Taglib指令用于在JSP页面中导入标签库,讲自定义标签技术时讲。
*****Tip:JSP运行原理和九大隐式对象*******!!!!重要!!!!
每个JSP 页面在第一次被访问时,WEB容器都会把哀求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
因为JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎假如发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发职员在编写JSP页面时获得这些web对象的引用,特地定义了9个相应的变量,开发职员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
这9个对象分别是哪些,以及作用也是笔试常常考察的知识点


一request哀求对象
二response相应对象
三config初始化参数
四application   web应用容器
五exception   错误对象
六Session  服务器为每个浏览器产生的Session对象
七page 指令对象
八out out隐式对象


Tip: out隐式对象
out隐式对象用于向客户端发送文本数据。
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相称于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至封闭它的缓存。
只有向out对象中写入了内容,且知足如下任何一个前提时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性封闭了out对象的缓存功能
out对象的缓冲区已满
整个JSP页面结束




实例

<head>
    <title>out隐式对象(使用需要留意的题目)</title>
  </head>
  <body>
    <%
    //下面的输出代码有题目
     out.write("wowowo");
     response.getWriter().write("hhaha");
    %>
  </body>

实例,用JSP实现下载

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="java.io.FileInputStream"%><%@page import="java.io.OutputStream"%><%
     String path = application.getRealPath("/download/1.jpg");
     String filename = path.substring(path.lastIndexOf("
\\")+1);
     
     FileInputStream in = new FileInputStream(path);
     int len = 0;
     byte buffer[] = new byte[1024];
     
     response.setHeader("content-disposition","attachment;filename=" + filename);
     OutputStream os = response.getOutputStream();
     while((len=in.read(buffer))>0){
       os.write(buffer,0,len);
     }
     in.close();
    %>

九pageContext

Tip: pageContext对象
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身仍是一个域对象,可以用来保留数据。并且,这个对象还封装了web开发中常常涉及到的一些常用操纵,例如引入和跳转其它资源、检索其它域对象中的属性等
Tip:通过pageContext获得其他对象
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
pageContext封装其它8大内置对象的意义,思索:假如在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将具有什么功能?
Tip:pageContext作为域对象
pageContext对象的方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)
pageContext对象中还封装了访问其它域的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)
代表各个域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法    (*重点,查找各个域中的属性)
Tip:引入和跳转到其他资源
PageContext类中定义了一个forward方法和两个include方法来分别简化和替换RequestDispatcher.forward方法和include方法。
方法接收的资源假如以“/”开头, “/”代表当前web应用。



7.JSP标签

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
Tip: JSP常用标签
<jsp:include>标签
<jsp:forward>标签
<jsp:param>标签
Tip: <jsp:include>标签
<jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。
语法:
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />

page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
Tip: <jsp:include>与include指令的比较
<jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并
而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并
无论是<jsp:include>标签,仍是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要泛起重复的HTML全局架构标签,否则输出给客户真个内容将会是一个格局混乱的HTML文档。
Tip: <jsp:forward>标签
<jsp:forward>标签用于把哀求转发给另外一个资源。
语法:
<jsp:forward page="relativeURL | <%=expression%>" />
page属性用于指定哀求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
Tip: <jsp:param>标签
当使用<jsp:include>和<jsp:forward>标签引入或将哀求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。
语法1:
<jsp:include page="relativeURL | <%=expression%>">
  <jsp:param name="parameterName" _cke_saved_name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
语法2:
<jsp:forward page="relativeURL | <%=expression%>">
  <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。


8.JSP内置对象

Tip:映射JSP
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
<load-on-startup>1</load-on-startup >
</servlet>
……
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>

9.如何查找JSP页面中的错误
JSP页面中的JSP语法格局有题目,导致其不能被翻译成Servlet源文件,JSP引擎将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。
JSP页面中的JSP语法格局没有题目,但被翻译成的Servlet源文件中泛起了Java语法题目,导致JSP页面翻译成的Servlet源文件不能通过编译,JSP引擎也将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。
JSP页面翻译成的Servlet程序在运行时泛起异常,这与普通Java程序的运行时错误完全一样,Java虚拟机将提示错误发生在Servlet源文件中的位置(行和列)以及相关信息。  

四. 重点总结

Tip:重点
到此为止,web开发接触到了4个域对象,这4个域对象是学习web的重点,也是笔试常常考察的知识点
pageContext(称之为page域)
request(称之为request域)
session(称之为session域)
servletContext(称之为application域)

明确如下题目:
什么是域?
这4个对象的生命周期?
哪种情况下用哪种域对象。

开发中的实际解决思路

什么情况下使用request:servlet帮用户产生数据后,数据用完就没用了,就存在request域内。
什么情况下使用session:servlet帮用户产生数据后,数据用完了,等一会儿还要用,就存在session中。
什么情况下使用servletContext:servlet帮用户产生数据后,数据用完了,等一会儿不仅自己要用,还要给别人用,这时就存在servletContext.


回复

使用道具 举报

  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2011-7-31 22:24:12 | 显示全部楼层
    谢谢楼主分享。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-7 13:40 , Processed in 0.435969 second(s), 51 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表