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相关文章