JSP开发技术二——————JSP语法

 

 

一、JSP模板元素

JSP页面中的HTML内容就是模板元素。

二、JSP表达式

用于将程序数据输出到客户端。

语法格式: <%=变量或表达式%> ,如:显示当前时间<%=new java.util.Date() %>

 

三、JSP脚本片段

  1、用于在JSP页面中嵌入多行JAVA代码。

<%

       多行java代码

%>

注意:脚本片段中只能写java代码,不能出现其他模板元素。

 

  2、一个JSP页面中可以有多个脚本片段,在两个或多个脚本片段之间可以嵌入文本、HTML标记或者其他JSP元素。

<%

       int x=10;

       out.print(x);

%>

<p>大家好</p>

<%

         int y =20;

         out.print(y);

%>

 

 

3、多个脚本片段中的java代码可以互相访问,犹如将所有代码放进一个脚本片段一样。

4、单个脚本片段中的java代码可以不完整,但是,多个脚本片段组合后的java代码应该是完整的。

<% 
	for(int i=0;i<10;i++)
	{
%>
 	<H1>www.baidu.com</H1>
<% 
	}
%>


四、jsp声明

 

1、如下jsp代码行不行???

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '3.jsp' starting page</title>
  </head>
  
  <body>
	
	<%
		public void run(){}
	 %>
  </body>
</html>



不行的。因为<%  、%>中间的内容会被服务器放到一个servlet的service方法中去。而一个方法中不能嵌套定义方法。

 

 写一个jsp如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>  
    <title>My  First JSP page</title>
  </head>
  
  <body> 
	<br>当前时间是为: 
    <%
    Date date = new Date();
    out.write(date.toLocaleString());
   %>
  
  </body>
</html>


查看服务器把它转换成的servlet(D:\arron\Tomcat6.0\work\Catalina\localhost\day08\org\apache\jsp下的_1_jsp.java)

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;

public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }

  public void _jspDestroy() {
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
      out.write("<html>\r\n");
      out.write("  <head>  \r\n");
      out.write("    <title>My  First JSP page</title>\r\n");
      out.write("  </head>\r\n");
      out.write("  \r\n");
      out.write("  <body> \r\n");
      out.write("\t<br>当前时间是为: \r\n");
      out.write("    ");

    Date date = new Date();
    out.write(date.toLocaleString());
   
      out.write("\r\n");
      out.write("  \r\n");
      out.write("  </body>\r\n");
      out.write("</html>\r\n");
      out.write("\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}


看看public void _jspService(HttpServletRequest request, HttpServletResponse response)
方法中有:

out.write("\t<br>当前时间是为: \r\n");
      out.write("    ");

    Date date = new Date();
    out.write(date.toLocaleString());

 

2、JSP页面中编写的所有代码默认会翻译到servlet的service方法中去,

但是,jsp声明中的java代码会被翻译到servlet的service方法外面去。

 

 所以,如果声明中定义了一个和转换成的servlet中的某个方法同名的话,就会覆盖那个方法。

 

语法如下:

<%!

      java代码

%>

 

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

 

多个静态代码块、变量和方法可以在一个jsp中声明,也可以在多个jsp中声明。

 

jsp中的隐式对象只左右在service方法中,所以,jsp声明中不能使用这些隐式对象。

 

对于1、  中的代码,改变如下即可:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '3.jsp' starting page</title>
  </head>
  
  <body>
	
	<%!
		public void run(){}
	 %>
  </body>
</html>


打开转换成的servlet(D:\arron\Tomcat6.0\work\Catalina\localhost\day08\org\apache\jsp下的_3_jsp.java)

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;

public final class _3_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {


		public void run(){}
	 
  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }

  public void _jspDestroy() {
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
      out.write("<html>\r\n");
      out.write("  <head>\r\n");
      out.write("    <title>My JSP '3.jsp' starting page</title>\r\n");
      out.write("  </head>\r\n");
      out.write("  \r\n");
      out.write("  <body>\r\n");
      out.write("\t\r\n");
      out.write("\t");
      out.write("\r\n");
      out.write("  </body>\r\n");
      out.write("</html>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}


我们发现了一个run方法在service方法外面。

 


五、JSP注释

1、jsp注释:<%--         --%>

2、html注释:<!--         -->

写一个4.jsp如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '4.jsp' starting page</title>
  </head>
  
  <body>
	//jsp注释
    <%--    aaa     --%>
	//html注释
	<!--    bbb    -->

  </body>
</html>


输出://jsp注释 //html注释

查看网页源代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '4.jsp' starting page</title>
  </head>
  
  <body>
	//jsp注释
    
	//html注释
	<!--    bbb    -->

  </body>
</html>


可以发现HTML注释被直接输出了。

所以以后jsp的注释不要用html的,否则会产生额外的数据,增加网站负担。

 

六、JSP指令

Jsp指令是为Jsp引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理Jsp页面中的其余部分。在Jsp2.0规范中共定义了三个指令: page指令 、 include指令、  taglib指令

    1、page指令:

        <%  @page

                    [language="java" ]

                    [extends= "package.class"]             //  翻译成的servlet继承什么

                    [import="java.util.Date,java.sql.*"]                           //导入包;默认导入  java.lang.*; java.servlet.*;  java.servlet.jsp;  等等     可以导入多个包,用逗号隔开

                    [session="true/false"]                当置为true时,   转换成的servlet中 会多出一行代码    HttpSession session = null;

                    [buffer="none| 8kb | sizekb "]                       //缓冲,  out写数据到浏览器,不是直接写,而是先写到缓冲区,在flush就可以写入。

                    [autoFlush="true"]

                    [isThreadSafe=" true/false"]             // JSP是否线程安全,  注意false为安全。

                    [info="text"]

                    [errorPage=" relative_url "]       //    JSP错误处理界面

                    [isErrorPage="true|false"]       //是不是错误页面

                    [ contentType="text/html; charset=ISO-8859-1"]

                    [ isELIgnored="false|ture"]       //  默认false,  就是不忽略EL表达式

             >

 

2、当jsp页面中代码出现异常时候,会产生无法访问的不好看的页面

 如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" 
session="true" isThreadSafe="false"
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP page</title>
  </head>  
  <body>What is dota functioning?          Dota as you like  !<br>
	<%
		if(true){
		int x=100/0;
		}
	 %>
  </body>
</html>

输入http://localhost:8088/day08/5.jsp

结果为:

 


为此,我们要在页面中加入错误处理页面,让用户有更好的体验。如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" 
session="true" isThreadSafe="false"
errorPage="/errors/error.jsp"
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP page</title>
  </head>  
  <body>What is dota functioning?          Dota as you like  !<br>
<%
if(true){
int x=100/0;
}
%>
  </body>
</html>



error.jsp如下

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'error.jsp' starting page</title>
  </head>
  
  <body>
    	对不起,出错了!!!
  </body>
</html>


当我们访问http://localhost:8088/day08/5.jsp时,因为,100/0会出错,所以会跳到页面。

结果为:  对不起,出错了!!!

 

 3、在web.xml中配置错误页面,对整个web应用都起作用。

web.xml中添加:

<error-page>
		<exception-type>java.lang.ArithmeticException</exception-type>
		<location>/errors/error.jsp</location>
	</error-page>


这样整个web应用中出现java.lang.ArithmeticException的话,都会跳转到errror.jsp页面。

 

4、如果在浏览器中输入http://localhost:8088/day08/hjkhjkhkhjkdhfkdsagfkdafgaksdhfads,即乱输入的情况下,浏览器会报出  404错误

在web.xml中添加

<error-page>
		<error-code>404</error-code>
		<location>/errors/404.jsp</location>
	</error-page>

编写404.jsp(主要内容要多点,不然不跳转。)

再在浏览器中输入http://localhost:8088/day08/hjkhjkhkhjkdhfkdsagfkdafgaksdhfads

跳转到404.jsp

 

5、jsp九大隐式对象

先写个jsp如下(会有错误,跳到错误页面)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" 
session="true" isThreadSafe="false"
errorPage="/errors/error.jsp"
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP page</title>
  </head>  
  <body>What is dota functioning?          Dota as you like  !<br>
	<%
		if(true){
		int x=100/0;
		}
	 %>
  </body>
</html>


 

错误页面如下,   记住要设置   session="true"          isErrorPage="true",不然隐式对象看不全。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" 
session="true"
isErrorPage="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'error.jsp' starting page</title>
  </head>
  
  <body>
    	对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!对不起,出错了!!!
  </body>
</html>


 

打开转换成的servlet,其核心代码如下:

 

public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
    if (exception != null) {
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


我们可以从中找到九大隐式对象:

request  、 response、 pageContext 、session 、exception、 application 、config 、out 、page

 

七、JSP标签

Jsp标签也称为Jsp Action元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码,造成Jsp页面难以维护。

 

八、JSP内置对象

九、查找JSP页面错误的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值