Java for Web学习笔记(十二):JSP(2)Tag:directive,declaration,scriptlet,expression

JSP中的java代码分为四类:

Directives<%@ thisis a directive %>

这是整体说明,用来指示JSP解析器动作(如设定Content-Type),整个文件的设定(例如使用java语言),引入class,其他的JSP,JSP tag库。

Declaration<%! thisis a declaration %>

用来定义变量,方法和内部类。也即在添加在翻译过来的java类中

Scriptlet<% thisis a scriptlet %>

同上,当添加在翻译过来的java类中的具体执行请求的_jspService()方法中。

Expression<%= thisis an expression %>

进行简单的表达式输出。

JSP的基本语法

通过下面test.jsp的例子进一步说明。我们在代码中加入了不同的方式的注释。

<!--下面是directive:
 - JSP JSP的缺省编码是ISO-8859-1,如果要支持非英文字符,建议更改为UTF-8。语言缺省是Java,目前也只支持java一种,可以编写。 
- 这里采用的标准XML的注释方式,将会出现在response中,即可以在页面的源码中看到。如果这样的注释里面加入JSP的java code,例如<%= addFive(100L) %>,会被直接输出为105的。JSP的tag在此是有效的。
-->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%!
/* 下面是Declaraion,在此演示了变量,方法,以及内部类 
*  这是java code,可以采用java的注释方式。这里的注释将会出现在java code中。*/
	private final int five=0;
	protected String cowboy = "rodeo";
	
	public long addFive(long number){
		return number + 5L;
	}
	
	public class MyInnerClass{
		
	}
	MyInnerClass instanceVariable = new MyInnerClass();	
%>

<%
//<!--下面是Scriptlet中,在此演示了变量,以及定义在方法中的内部类(虽然极少使用) 
	class WeirdClassWithinMethod{
	}
	WeirdClassWithinMethod wc = new WeirdClassWithinMethod();
	MyInnerClass innerClass = new MyInnerClass();
	int seven = 7;	
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chapter 04 : Test</title>
</head>
<body>
	<h1>Hello, JSP!</h1>
<%--下面是Expression中,进行了输出。这里采用JSP的注释,将不会被作为页面的一部分传递,也不出现在test_jsp.java中,
没有被JSP编译器进行翻译 --%>
	<%= addFive(seven) %>
</body>
</html>

视图

我们看看JSP编译器器翻译的test_jsp.java,将更好地了解这四种在代码中的位置。(注意:前面代码的注释是后加,并不出现在我们进行翻译的的test.jsp文件中)

package org.apache.jsp;
…….
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {
 
/*--------------------------- 这是declaration:写在Class中的  ---------------------*/
            private final int five=0;
            protected String cowboy = "rodeo";
           
            public long addFive(long number){
                       return number + 5L;
            }
 
            public class MyInnerClass{
                   
            }
            MyInnerClass instanceVariable = new MyInnerClass();     
 
 … …
 
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {
 
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
 
    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
 
try {
/*--------------------------- 这是derective中的Content-Type部分:整体对响应进行处理的  ---------------------*/
      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('\n'); 
      out.write('\n');
/*--------------------------- 这是Scriptlet的部分:写在方法_jspService()中的  ---------------------*/
            class WeirdClassWithinMethod{
            }
            WeirdClassWithinMethod wc = new WeirdClassWithinMethod();
            MyInnerClass innerClass = new MyInnerClass();
            int seven = 7;       
      out.write("\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
      out.write("<title>Chapter 04 : Test</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("\t<h1>Hello, JSP!</h1>\n");
      out.write("\t");
/*--------------------------- 这是Expression的部分:给出页面输出  ---------------------*/
      out.print( addFive(seven) );
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
     ……
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

在_jspService()中,我们用黑体颜色标识了部分对象,这些可以在jsp的scriptlet中使用。这些都在JSP的规范中,而_jspx_out和_jspx_page_context则是tomcat的参数,这两个不应被使用。这些参数在编写jsp代码很关键,需要进行介绍。

request和response:这和Servlet中的使用方式没有区别,我们可以从中获得GET或POST参数,需要注意的是,有些设置归JSP处理,不要再次重复操作。不要设置后面提及的directive属性,例如Content-Type;不要进行getWriter()或者getOutputStream(),因为jsp已经有out;否者在运行是会出现不可预测的错误。

HttpSession session = pageContext.getSession(),同样和Servlet一样进行操作。

JWriter out如同Servlet中的getWriter()的文本操作,但是一般情况下,我们在jsp应直接使用HTML代码或者expression。

application是ServletContext的实例,可以用来获取初始化配置中的context-param。

config则是ServletConfig的实例,可以获取初始化配置中Servlet的参数。JSP也是一个servlet,同样可以进行配置。

pageContext一般不在jsp中使用,而是通过jsptag。

page是java.lang.Object,是this,也就是可以转化为类型Servlet,JspPage(继承Servlet)和HttpJspPage(继承JspPage)。

exception是jsp设置为errorPage时有用,一般下isErrorPage为false,所以没有这个参数。

下面是一个获取checkbox输入内容的例子。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%
    String[] fruits = request.getParameterValues("fruit");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Checkbox Submit</title>
</head>
<body>
    <h2>Your selections:</h2>
    <%
    if(fruits ==null){
    %>You did not select any fruits.<%
    }else{
    %><ul><%
         for(String fruit: fruits){
             //out.println("<li>" + fruit + "</li>");//这里是通过out直接输出,不过一般应该采用expression的方式
             %><li><%= fruit %></li><%
         }
    %></ul><%
    }
    %>
</body>
</html>

下面是一个获取Context的初始化参数的例子:

……
<body>
    settingOne:<%= application.getInitParameter("settingOne")%><br/>
    settingTwo:<%= application.getInitParameter("settingTwo")%>
</body>
</html>

相关链接: 我的Professional Java for Web Applications相关文章
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值