您的位置:首页 > 编程语言 > Java开发

JavaWeb之JSP--------------JSP小结

2017-10-15 12:44 225 查看
最近对JSP有所深入,于是针对性的试图将JSP的主要要点小结一下。

这一篇主要是简单的基础概念和一些简单的使用。

1.理解JSP。

JSP全称Java Server Pages,通常的解释可以响应客户端请求,动态的生成HTML,XML或其他类似的Web网页。
JSP将Java语言作为脚本语言,我们可以在网页里面嵌入Java代码,通俗点说,JSP就是一个在网页上运行Java语言的一种程序。
实际上,当服务器解析JSP页面的时候,会事先将其转换为Servlet。
我们看一下代码就知道了:
先简单写一个JSP例子,看一下他们的转换结构。


我们的源代码:

<body>
This is my JSP page. <br>
<div class="left">
<form action="demo-form.php">
Email:  <input type="text" name="email"><br>
Pin:   <input type="text" name="pin" maxlength="4"><br>
<% system.out.println("我是JSP页面中的java代码");%>
<input type="reset" value="重置">
<input type="submit" value="提交">
</form>
</div>
</body>


生成的Java代码

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

private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();

private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager;

public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}

//初始化方法,调用相关的组件
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());

//销毁方法
public void _jspDestroy() {
}

//主要service方法
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');

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

out.write("\r\n");
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("    <base href=\"");
out.print(basePath);
out.write("\">\r\n");
out.write("    \r\n");
out.write("    <title>My JSP 'test.jsp' starting page</title>\r\n");
out.write("    \r\n");
out.write("\t<meta http-equiv=\"pragma\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"cache-control\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"expires\" content=\"0\">    \r\n");
out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");
out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");
out.write("\t<!--\r\n");
out.write("\t<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">\r\n");
out.write("\t-->\r\n");
out.write("\r\n");
out.write("  <script>\"undefined\"==typeof CODE_LIVE&&(!function(e){var t={nonSecure:\"8123\",secure:\"8136\"},c={nonSecure:\"http://\",secure:\"https://\"},r={nonSecure:\"127.0.0.1\",secure:\"gapdebug.local.genuitec.com\"},n=\"https:\"===window.location.protocol?\"secure\":\"nonSecure\";script=e.createElement(\"script\"),script.type=\"text/javascript\",script.async=!0,script.src=c
+r
+\":\"+t
+\"/codelive-assets/bundle.js\",e.getElementsByTagName(\"head\")[0].appendChild(script)}(document),CODE_LIVE=!0);</script></head>\r\n");
out.write("  \r\n");
out.write("  <body data-genuitec-lp-enabled=\"false\" data-genuitec-file-id=\"wc1-12\" data-genuitec-path=\"/spring_mybatis_springmvc/WebRoot/test.jsp\">\r\n");
out.write("    This is my JSP page. <br data-genuitec-lp-enabled=\"false\" data-genuitec-file-id=\"wc1-12\" data-genuitec-path=\"/spring_mybatis_springmvc/WebRoot/test.jsp\">\r\n");
out.write("    <div class=\"left\">\r\n");
out.write("    \t<form action=\"demo-form.php\">\r\n");
out.write("  \t\t\tEmail: \t<input type=\"text\" name=\"email\"><br>\r\n");
out.write(" \t\t\t Pin: \t<input type=\"text\" name=\"pin\" maxlength=\"4\"><br>\r\n");
out.write(" \t\t\t \t\t");
System.out.println("我是JSP页面中的java代码");
out.write("\r\n");
out.write(" \t\t\t\t \t<input type=\"reset\" value=\"重置\">\r\n");
out.write("  \t\t\t\t\t<input type=\"submit\" value=\"提交\">\r\n");
out.write("</form>\r\n");
out.write("    </div>\r\n");
out.write("  </body>\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 {
if (response.isCommitted()) {
out.flush();
} else {
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);
}
}
}


这里我们可以看到,我们在jsp页面中的html代码被out.writer包含起来了。

c652
而机构几乎和网页上的一样,不难猜出,这里是将html进行了一个暂时的封存

(out是一个jsp的内置对象,作用是讲里面的内容输出到网页上,这个在后面再详细解释。)

这里注意这样两条语句:

//jsp
<% system.out.println("我是JSP页面中的java代码");%>

//java
out.write(" \t\t\t \t\t");
System.out.println("我是JSP页面中的java代码");
out.write("\r\n");




很明显,我们的jsp页面中的Java语句在服务端运行了。

所以,这里大致解释一下,JSP的作用:

从某种程度上说,JSP和JavaScript(这里把JQ等后续技术也包括在内)目的性一样,都是为了实现动态的网页,JSP是与后端进行的一定的耦合,表面上是在前端实现一定的逻辑,实际上还是在后端进行逻辑判断。

而JS是前端性质的,逻辑可以直接在前端进行。

JSP有自己的特点,使用时要看情况,例如:JSP的压力主要放在服务端,虽然可以做前端的逻辑,但是并不是很明智。而当初期对前端JS和相关脚本语言没有深入了解的情况下,通常也直接用JSP来实现逻辑,即便是一个不熟悉脚本语言的网页开发者,也完全可以利用JSP做出漂亮的动态网页。

也有人说JSP已经落伍了,JS才是王道,当然也不一定对,动静结合,相互配合,才是好办法。

2.JSP的处理流程。

在服务端,JSP引擎来处理JSP页面,即为JSP容器。

JSP容器会与web容器协同合作。

其实往往我们把他们看成了同一个,并没有专门关注。

下面是JSP的运行流程。

1.浏览器发送一个HTTP请求给服务器

2.web服务器端识别出这是一个JSP页面的请求(通过URL或者.JSP来完成)将请求转交给JSP引擎

3.JSP引擎从磁盘中载入相应的JSP文件,然后转化为servlet.这只是简单的把模板文本用相关的语句封装起来

,并且将所有的JSP元素转换为java代码

4.JSP容器将servlet编译为可执行类,并且将原始请求传递给Servlet引擎.

5.web服务器的某主键会根据请求调用servlet容器,然后载入并且执行servlet类、在执行过程中,servlet会产生HTML格式的输出并且嵌于 HTTP response 中上交给 Web 服务器

(这里就是将JSP代码在服务端进行了逻辑执行,并且生成HTML静态页面)

6.Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中

7.最终,Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样

这里的处理流程是不是联想到了AJAX,AJAX可以弥补JSP过于繁琐的执行流程,方便的实现动态网页。

至此,一个网页的动态实现就完成了。

3.JSP的生命周期。

任何逻辑程序都是有生命周期的,JSP也不例外。

我们大致可以把JSP的执行流程进行一个归类,得到一个初略的生命周期。

1.编译阶段

servlet容器编译servlet源文件,生成servlet类

2.初始化阶段

加载JSP对应的servlet类没创建其实例,并且调用他的初始化方法,init()

3.执行阶段

调用与JSP对应的servlet实例的执行方法

4.销毁阶段

调用与JSP对应的SERVLET实例的销毁方法,然后销毁servlet实例

4.JSP的语法。

JSP的语法其实很简单

只需要用

<%................%>


将语句括起来就行。

下面介绍一些JSP语法的简单运用。

1.定义变量(JSP可以定义一个到多个变量)

//格式
<%! declaration; [ declaration; ] ... %>

//案例
<%! int i = 0; %>
<%! int a, b, c; %>


2.JSP表达式

JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。

由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签

表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。

意味着任何java语言先被执行,再被转换为String,最终插入到相应的位置。

因为已经被转换为String,所以不存在语法错误。

<%= 表达式 %>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>


3.JSP注释

语法描述
<%– 注释 –%>JSP注释,注释内容不会被发送至浏览器甚至不会被编译
< !– 注释 –>HTML注释,通过浏览器查看网页源代码时可以看见注释内容
<\%代表静态 <%常量
%>代表静态 %> 常量
\’在属性中使用的单引号
\”在属性中使用的双引号

5.总结

JSP的基础小结就差不多了,后面就是JSP实际应用中的指令和内置对象了。

这个日后再说。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: