JavaWeb_day07_JSP
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.
**转载请注明 出自 : luogg的博客园 ** 谢谢配合!
day07 JSP
全称 :Java Server Pages ,jsp实际就是一个servlet
jsp运行机制: 用户访问jsp页面,服务器将其转换成servlet,也就是java文件,然后编译成class文件,最后运行,最后响应给用户。
工程jsp中很多波浪线报错,是因为找不到jar包。
jsp也是一个servlet
public final class HelloJSP_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent {
在G:\eclipse项目.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\employeePro\org\apache\jsp 中找到当前项目的jsp文件,可以看到jsp被编译成了java和class文件,修改jsp,运行,可以看到被编译之后的java文件已修改。在_jspService方法下修改了。
我们去tomcat的lib目录找到org.apache.jasper.runtime.HttpJspBase,然后对其反编译,public abstract class HttpJspBase extends HttpServlet implements HttpJspPage { 发现jsp继承的HttpJspBase也继承了HttpServlet,说明jsp也继承了HttpServlet。
JSP设置编码格式
右键文件->properties->other utf-8
设置jsp默认编码:windows->preference->搜索jsp->jsp file->encoding修改utf-8
一般不直接复制文件,会乱码,ctrl+A,复制全部代码然后粘贴到同类名的文件中
JSP脚本元素
<% 普通java代码,局部变量,放在了jspService方法中 %>
<%! 全局变量,放在_jsp_Service方法外边%> 非静态,只是定义在类中的全局变量,在jsp声明中不可以使用javaService方法中的9个隐式对象.
<%= 表达式,输出时候使用%> 比如 : <tr><td><%=rs.getInt(1) %></td><td><%=rs.getString(3) %></td></tr>
JSP注释
1.HTML注释 注释在翻译的java文件也存在,在页面也存在
2.Java注释,在翻译成的java文件中也存在,在页面不存在.
<%
1.//
2./* */
3./** **/
%>
3.JSP注释:<%-- --%>只存在于jsp页面
JSP指令
语法 : <%@ 指令元素 属性名=属性值 %>
如果一个指令有多个属性,这多个属性可以写在一个指令中,中间用空格隔开。即上面两条指令等价表示如下
JSP共有3个指令:
1.page指令: page指令用于定义JSP页面的各种属性,import属性可以出现多次,其他属性只能出现一次,重点:session,import,contentType,pageEncoding,isELIgnonred
- session属性为true时,翻译后的servlet中会自动创建session对象,false则不创建。
- errorPage属性:指定错误页面
- isErrorPage属性 :为true时,表示该页面是处理错误页面,JSP引擎在翻译成servlet时,会定义一个exception对象,从而就可以用exception隐式对象获得出错信息。
- import属性:引入java中的jar包(使用多次)
- language属性:JSP文件允许嵌入的语言,只支持一种JAVA语言.
- extends:JSP翻译成Servlet文件时servlet继承的类.(不需要改变)
- buffer属性:设置缓冲区大小
- aotoFlush:设置默认刷新缓冲区(不需要修改)
- contentType属性:服务器端输出所有内容采用的编码
- pageEncoding属性:JSP翻译成Servlet文件时采用的编码
- isElIgnored属性:是否忽略EL表达式(false不忽略)
2.include指令,静态引入其他JSP页面,
- 语法:<%@ include file="要包含文件的地址(静态包含)" %>
<%@ include file="/include/head.jsp" %>
3.taglib指令:引入标签库文件语法:<%taglib %>
属性:
- uri :引入标签库文件的名称
- prefix:标签库的前缀名
JSP9大隐式对象(直接使用)
request://就是Servlet里的HttpServletRequest , 方法setAttribute() getAttribute()
response: //就是Servlet里的HttpServletResponse,方法:addCookie() , getWriter()
session: //就是Servlet里的HttpSession,方法setAttribute() ,getAttribute()
application: //就是servlet里的 servletContext,方法setAttribute() , getAttribute()
config: //就是Servlet里的servletConfig,方法getInitParameter(), getInitParameterNames()
page: //就是Servlet自己,Object
exception: //异常,只有errorPage才有,并且isErrorPage=true时才可以使用
out://JSP页面输出,JspWriter,方法 write() , print()
pageContext://pageContext方法setAttribute(), getAttribute(), 域对象,自己存取值 , 向其他的域存取值。可以获取其他8个对象。编写框架或者通用性较高代码。
- pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。
- setAttribute(String name, Object value, int scope)
- getAttribute(String name, int scope)
- findAttribute(String name)
返回page隐式对象
getRequest() //方法返回request隐式对象
getResponse() //方法返回response隐式对象
getgetServletContext() //方法返回 application隐式对象
getServletConfig() //方法返回config隐式对象
getSession() //方法返回session隐式对象
getOut() //方法返回out隐式对象
另外还有个findAttribute方法(*重要,查找各个域中的属性,EL表达式就依赖于这个方法),可以直接调用pageContext.findAttribute(String name),首先会从pageContext里找该属性,如果没有,会依次按照下面顺序在相应的域中查找:request, session, servletContext,如果没找着,返回null,否则返回属性值。
pageContext类中定义了一个forward方法和两个include方法分别简化和替代RequestDispatcher.forward方法和include方法,方法接收的资源如果以"/"开头,"/"代表当前web应用。不过这里的include是动态包含,不建议使用include。
JSP4个域对象
ServletContext application域,整个web应用,servletContext中存的数据在整个应用程序范围内都可以取出
session session域,一次会话,/session中存的数据在会话范围内都可以取出
request request域,一次请求,request中存的数据在请求范围内都可以取出
pageContext page域,当前页面,pageContext中存的数据在页面范围都可以取出
JSP3大标签(动作)
它用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码造成JSP页面难以维护。
1.jsp:include标签 : 页面的包含(动态包含)
- 属性:page 要包含的页面
- 语法:
<jsp:include page="index.html"></jsp:include>
相当于调用pageContext.include("relativeURL")
2.jsp:forward标签 : 转发
- 属性:page 要转发的页面
- 语法:
<jsp:forward page=""></jsp:forward>
3.jsp:param标签 : 当使用jsp:include和jsp:forward标签引入或将请求转发给其它资源时,可以使用jsp:param标签向这个资源传递参数。
- 属性 : name:参数名称 value:参数值
- 语法 :
<jsp:include page="index.jsp"> <jsp:param value="" name=""/> </jsp:include>
相当于index?name=...&value=....
或者
<jsp:forward page="index.jsp"> <jsp:param value="" name=""/> </jsp:forward>
JSP映射
JSP也可以像Servlet那样映射,因为JSP本来就是Servlet。
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>
/jsp/simple.jsp表示在webRoot/jsp目录下的simple.jsp文件
include指令与include动作区别
include指令:<%@include file="top.jsp" %>
include标准动作:<jsp:include page="top.jsp"></jsp:include>
include指令:是在编译之前就把包含文件的代码合并在了一起,共同生成一个.java文件,所以在编译的时候会出现重复定义了本地变量的情况。而include动作先将主页面独立生成一个.class文件,运行时候和包含的文件合并在一起,所以不会出现重复定义变量的错误信息。
设置404 500错误提示页面
在xml中加入:
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
然后在错误指定的页面page指令中输入isErrorPage="true"
JavaWeb_day07_JSP的更多相关文章
随机推荐
- 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)
统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...
- 【HanLP】资料链接汇总
Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...
- 从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(二)
在上一节中,主要阐述了JavaScript方面的学习路线.先列举一下我朋友的经历,他去过培训机构,说是4个月后月薪过万,虽然他现在还未达到这个指标. 培训机构一般的套路是这样:先教JavaSE,什么都 ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- 机器指令翻译成 JavaScript —— No.7 过渡语言
上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言.现在我们来研究一下,将 6502 指令转换成 C 的可行性. 跳转支持 翻译成 C 语言,可比 JS 容易多了.因为 C 支持 ...
- 免费开源的 .NET 分布式组件库 Exceptionless Foundatio
前言 在互联网时代,分布式应用.系统变得越来越多,我们在使用 .Net 技术构建分布式系统的时候,需要使用到一些组件或者是助手库来帮助我们提高生产力以及应用程序解耦,但是纵观.Net圈,能够符合要求的 ...
- Javascript实践技巧
最近辞职了,准备北上.期待有个好结果~ 本文以<Javascript高级程序设计>为基础,结合自身经验来总结下Javascript实际工作方面的知识. 一.可维护性 1.代码约定 ...
- 图形数据库Neo4J简介
最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有意思的.因此在这里给大家做一个简单的介绍. NoSQL数据库相信大家都听说过.它们常常可以用来处理传统的关系型数 ...
- web前端的春天 or 噩梦
「 微信应用号可以做什么」 简单说,微信"小程序"可以为开发者提供基于微信的表单.导航.地图.媒体和位置等开发组件,让他们在微信的网页里构建一个 HTML 5 应用.同时微信还开放 ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...