JSP基础语法

159 阅读5分钟

JSP简介

JSP: Java Server Page ,SUN公司提供的动态网页编程技术,是Java Web服务器端的动态资源。

它相比 html而言,html 只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。

不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

其实Jsp就是一个Servlet,当我们第一次访问Jsp 的时候,Jsp引擎都会将这个Jsp翻译成一个Servlet,这个文件存放在tomcat (源码目录)中的work目录中。

注释

在JSP中支持两种注释的语法操作:
一种是显示注释,这种注释是允许客户端看见的;另一种是隐式注释,此种注释是客户端无法看见的。

  • 显示注释语法:从HTML风格继承而来
  • 隐式注释语法:从JAVA风格继承(在脚本段中起作用);JSP自己的注释

JSP的三种注释方式:

1) //单行注释   /*多行注释*/
2) <!-- HTML风格的注释 -->
3) <%-- JSP注释 --%>

Scriptlet

在JSP中最重要的部分就是Scriptlet(脚本小程序),嵌入在HTML代码中的Java程序。 在JSP中一共有三种Scriptlet代码:都必须使用Scriptlet标记出来

第一种: <% %> : java脚本段,可以定义局部变量、编写语句
第二种: <%! %>: 声明,可以定义全局(成员)变量、方法、类
第三种: <%= %>: 表达式,数据一个变量或具体内容的输出

JSP的指令标签

使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。

方法一:在每个JSP页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容
方法二︰将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入

很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在JSP中如果要想实现包含的操作,有两种做法:静态包含动态包含,静态包含使用 include指令即可,动态包含则需要使用include动作标签。

include静态包含

<%@include file="要包含的文件的相对路径"%>

例如:

<%@include file="include.jsp"%>
<%@include file="include.html"%>

静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样是在servlet引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起,全部放到_jspService方法中),所以只生成了一个servlet,所以两个页面不能有同名的变量。运行效率高一点点。耦合性较高,不够灵活。

include动态包含

动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。

<jsp:include page="要包含的文件的相对路径"></jsp:include>

注意:动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!

<jsp:include page="include.jsp"></jsp:include>
<%
    String a="hello.jsp";
%>
<jsp:include page="<%=a %>"></jsp:include>

使用动态包含还可以通过在页面之间传参。

<jsp:include page="要包含的文件的相对路径">
    <jsp:parm name="参数名" value="参数值"/>
</jsp:include>

name属性不支持表达式,value属性支持表达式

接收参数通过request.getParameter(name);

<%
    String name=request.getParameter("name");
%>

JSP的四大域对象

四种属性范围

在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以再多少个页面中保存并可以继续使用

  • page范围 pageContext:只在一个页面中保存属性,跳转之后无效
  • request范围 request:只在一次请求中保存,服务器跳转后依然有效
  • session范围 session:在一次会话范围中,无论何种跳转都可以使用
  • application范围 application:在整个服务器上保存

四种属性通用方法:

方法类型描述
public void setAttribute(String name,Object o)普通设置属性的名称及内容
public Object getAttribute(String name)普通根据属性名称获取属性
public void removeAttribute(String name)普通删除指定属性

验证属性范围的特点

  • page 本页面取得服务器端跳转(<jsp : forward>)后无效
  • request 服务器跳转有效,客户端跳转无效。
    如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了;如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围。
  • session 无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中,并在相关的页面取得。
    对于服务器而言,每一个连接到它的客户端都是一个session
    如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application。
  • application 所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得。
    只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。
<%
	pageContext.setAttribute("name1", "zhangsan");
	request.setAttribute("name2", "lisi");
	session.setAttribute("name3", "wangwu");
	application.setAttribute("name4", "zhaoliu");
%>
<%-- jsp中服务端跳转 --%>
<%-- <jsp:forward page="jsp四大域属性.jsp"></jsp:forward> --%>
<%-- jsp中超链接跳转 --%>
<a href="jsp四大域属性.jsp">跳转</a>
<%
	out.print("page范围:"+pageContext.getAttribute("name1")+"<br>");
	out.print("request范围:"+request.getAttribute("name2")+"<br>");
	out.print("session范围:"+session.getAttribute("name3")+"<br>");
	out.print("application范围:"+application.getAttribute("name4")+"<br>");
%>