JSP(java server page )是运行子啊服务器端的页面,是动态网页。是在静态html基础上插入java代码和JSP标签形成的一种文件。JSP是跨平台的。
JSP本质是Servlet,但是JSP只用于页面展示,不参与业务逻辑处理,。JSP由于继承servlet,也是单例多线程的。
当客户端第一次访问jsp页面时,Tomcat有一个内置的jsp翻译器,将jsp先翻译成servlet的.Java文件,然后再将其编译为.class文件。(所以第一次加载jsp页面时会速度较慢)
编译完的文件在workspace中存储在apache-tomcat\work\Catalina\localhost\JSPProject\org\apache\jsp中
jsp的注释有2种.一种为HTML注释,用<!-- -->表示.
另一种为jsp注释,用<%-- --%>表示.
区别为:html注释会在编译为java文件时保留,在客户端页面也可以看到html注释.
而jsp注释会在编译时被忽略.
所以:需要在客户端页面上可以看到的用HTML注释
不希望客户看到的注释需要使用jsp注释.
JSP中,可以插入Java代码块,使用<% %> 标识. JSP编译为Servlet时,会将标识符之间的代码完全写进生成Servlet文件的Service方法中,直接以代码形式出现.而标识符之外的HTML代码会以字符串形式输出.
举例:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
int i = 25;
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<!--
这是html注释
-->
<%--
这是JSP注释
--%>
</head>
<%
int j = 2;
%>
<body>
Test JSP Page<br>
</body>
<%
System.out.println(i/j);
%>
</html>
上面插入了JSP注释和HTML注释各一段,Java代码3段(且再不同位置),然后编译完成的java为:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
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 {
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');
out.write('\n');
int i = 25;
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(" \r\n");
out.write(" <title>My JSP 'index.jsp' starting page</title>\r\n");
out.write("\t<!--\r\n");
out.write("\t这是html注释\r\n");
out.write("\t-->\r\n");
out.write("\t\r\n");
out.write("\t");
out.write("\r\n");
out.write(" </head>\r\n");
out.write(" ");
int j = 2;
out.write("\r\n");
out.write(" <body>\r\n");
out.write(" Test JSP Page<br>\r\n");
out.write(" </body>\r\n");
out.write(" ");
System.out.println(i/j);
out.write("\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.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);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
对照上面结果可知,编译完成时,html注释会留下,但是JSP注释会被忽略.
并且,JSP页面中Java块里的Java语句,被直接写入Service方法中了.其他不在Java代码块中的代码会被视为字符串进行输出.
所以,各个代码块之间间隔的的其他html代码或注释对java代码毫无影响.(在代码块中可以写java注释...而且会被编译进Java文件中)
所以JSP页面中Java块里代码,可以理解成:整个页面只有Java块中代码会被编译到Servlet的Service方法中.
由于代码全部在方法中,所以应该注意如下问题:
1.每段Java代码必须有";"结尾,否则直接报错.
2.声明变量不可以加权限修饰符,因为都是方法中的局部变量.
3.代码块中不能再添加方法,因为编译后的代码本身就在一个Service方法中,不能再再方法中另写方法.
4.不能定义静态的语句块或变量,因为静态块在生成类时就已经生成,但是此时方法还未调用.明显矛盾
此外,JSP中还有声明语句块,用<%! %>标识,比java代码块多了个叹号,这个编译的时候不会编译进Service方法,而是会被编译到
这个页面对应类的下面.此时块中声明的变量就是这个页面类的成员变量,也可以使用权限修饰符了.也可以在此中添加方法并被以后的Java语句块中调用.甚至可以使用静态语句块.
但是!此时由于在单例多线程的servlet中如果添加静态块的话,会产生线程安全问题,需要谨慎使用!尽量不要使用!
JSP中有表达式块:
用<%= %>表达式块中可以直接写Java代码块中有变量.会直接将该变量输出在页面上.表达式块中变量不需要加";"结尾.
编译时会将代码块中变量直接输出在标准输出流中.
如:
Java块:<% int number = 100;%>
JSP表达式块:<%= number %>
编译后:
out.print("number");
结果会直接在页面上输出100.