JSP------Servlet的另一种形式

在上篇Servlet登录实例中,用到了一个html进行访问,一个Servel处理和输出,Servlet输出显示的时候采用下面的拼接字符串的形式显示。在拼接的html标签中,css或js同样一个个的嵌入,这样的坏处是显示和处理没有分离。而且修改html输出的时候很麻烦。

StringBuffer sbHtml = new StringBuffer();
sbHtml.append("<html>");
sbHtml.append("<head>");
......
response.getWriter().println("sbHtml.toString()"); 

JSP:可以先简单理解为html标签中间嵌入和java代码。下面以HelloWorld为例:

jsp脚本:嵌入的java代码表现形式。:<%!    定义成员属性和方法的,此种方式使用很少      %>

<%     定义局部变量,在jsp_service方法中使用,使用广泛       %>

<%=    后面必须是字符串变量或者可以被转换成字符串的表达式      %>

  注释:<%--… …--%>,<%  //… …   %>,<%   /*… …*/   %>

<span style="font-size:14px;">
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

<html>
    <head>
        <title> HelloWorld </title>
    </head>
    <body>
            <%--这个注释只是在jsp页面中注释,生成的代码中没有 --%>        
            <%// 单行注释,下面定义的为成员变量 %>
        <%!
            int i = 10;            
            public void method1() {            
            }
        %>       
            <% /*
                多行注释
                下面定义的为局部变量,放在jsp_service方法中使用
             */%>
        <%
            out.println("HelloWorld");
            String username = "zhangsan";
        %>            
        <input type="text" name="username" value="<% out.print(username); %>">        
        <input type="text" name="username" value="<%=username %>">
        <input type="text" name="username" value="<%=i %>">
        <input type="text" name="age" value="<%=10+1 %>">               
    </body>
</html></span>

jsp的执行过程

1.客户端:  
http://localhost:8080/test_jsp/HelloWorld.jsp访问。

2.Tomcat服务器:   conf文件中web.xml文件,执行JspServlet这个类

<span style="font-size:14px;">
    <servlet>
       <servlet-name>jsp</servlet-name>
       <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
       ........

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping></span>

3.JspServlet:  继承与HttpServlet覆盖Service()方法:对于第一访问的jsp会生出一个Servlet类(HelloWorld_jsp.java和HelloWorld_jsp.class),不是第一次的访问已经生成的对应的Servlet类

4. HelloWorld_jsp:  继承与HttpJspBase(HttpJspBase类中Service()调用_jspService()方法,_jspService()方法在HttpJspBase类中没有实现,有子类实现)

5.HelloWorld_jsp中_jspService()方法来执行java代码输出html标签。

JspServlet.java和HttpJspBase.java代码Tomcat源码中有我们不做重点了解,知道jsp最后转换成了Servlet代码来执行。

对应的时序图:

生成的HelloWorld_jsp.java

<span style="font-size:14px;">
package org.apache.jsp;

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

public final class HelloWorld_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {
			int i = 10;
			public void method1() {
			}

  private static java.util.List _jspx_dependants;

  public Object getDependants() {
    return _jspx_dependants;
  }

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

    JspFactory _jspxFactory = null;
    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 {
      _jspxFactory = JspFactory.getDefaultFactory();
      response.setContentType("text/html; charset=GB18030");
      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("\r\n");
      out.write("<html>\r\n");
      out.write("\t<head>\r\n");
      out.write("\t\t<title> HelloWorld </title>\r\n");
      out.write("\t</head>\r\n");
      out.write("\t<body>\r\n");
      out.write("\t    ");
      out.write("\r\n");
      out.write("\t    \r\n");
      out.write("\t\t");
// 鍗曡娉ㄩ噴锛屼笅闈㈠畾涔夌殑涓烘垚鍛樺彉閲?
      out.write("\r\n");
      out.write("\t\t");
      out.write("\r\n");
      out.write("\t\t\r\n");
      out.write("\t\t\r\n");
      out.write("\t\t");
 /*
		    澶氳娉ㄩ噴
			涓嬮潰瀹氫箟鐨勪负灞?閮ㄥ彉閲忥紝鏀惧湪jsp_service鏂规硶涓娇鐢?
		*/
      out.write("\r\n");
      out.write("\t\t");

			out.println("HelloWorld");
			String username = "zhangsan";

      out.write("\t\r\n");
      out.write("\t\t\r\n");
      out.write("\t\t<input type=\"text\" name=\"username\" value=\"");
 out.print(username);
      out.write("\">\t\t\r\n");
      out.write("\t\t<input type=\"text\" name=\"username\" value=\"");
      out.print(username );
      out.write("\">\r\n");
      out.write("\t\t<input type=\"text\" name=\"username\" value=\"");
      out.print(i );
      out.write("\">\r\n");
      out.write("\t\t<input type=\"text\" name=\"age\" value=\"");
      out.print(10+1 );
      out.write("\">\r\n");
      out.write("\t\t\t\t\r\n");
      out.write("\t</body>\r\n");
      out.write("</html>");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
</span>

jsp指令:

在jsp的开头指令代码指明了jsp和Tomcat之间的沟通方式,指明返回客户端显示的样式等设置

<span style="font-size:14px;">
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
</span>

全部:

<span style="font-size:14px;">
<%@page language=“script language”|
			extends=“className”|
			import=“importList”|
			buffer=“none|kb size”|   --none:不缓冲,默认8k
			session=“true|false”|   --是否可以使用session,默认true
			autoFlush=“true|false”  --缓冲器是否自动清除,默认true
			isThreadSafe=“true|false”|  --默认false(永远不要设成true)
			info=“infoText”|    --任何字符
			errorPage=“errorPageUrl”|
			isErrorPage=“true|false”|
			contentType=“contentTyepInfo”|		pageEncoding=“gb2312”
%>
</span>

JSP的内置对象(9个)

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

这几个对象不需要声明引入对应的包就可以直接使用。例如 out.println("HelloWorld");但嵌入的java代码就需要添加对应的引用如:

<span style="font-size:14px;">
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%></span>

jsp在第一访问的时候会转换成Servlet代码,接着编译成类文件来执行,以后访问不在编译(修改的后会从新编译)Servlet中拼接html串输出,JSP中html代码中嵌入java代码,还是没有做到,处理和显示的分离。为了解决这个问题出现了基于jsp+servlet的mvc架构。

版权声明:本文不足之处在所难免,敬请各位批评指正,留下宝贵意见。

时间: 2024-08-09 19:51:34

JSP------Servlet的另一种形式的相关文章

JSP/Servlet 工作原理

JSP/Servlet 工作原理(转载) 2014-03-08 23:20 1829人阅读 评论(0) 收藏 举报 Servlet Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器. Servlet 运行在 Servlet 容器中,并由容器管理从创建到销毁的整个过程. 对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和 ServletResponse对象

JSP/Servlet基础语法

相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html http://blog.csdn.net/liaoxiaohua1981/article/details/6761053 http://computer.c.blog.163.com/blog/static/102524482012314537670/ http://ww

include的两种形式与介绍

include的另种形式和区别先简单的说下include的两种形式:<% include file="" %>:为静态包含(加载)<jsp:include page="" flush="true" />:为动态包含(加载) 简单来解释一下静态包含和和动态包含:静态包含:JSP编译器编译的时候已经包含好相应的文件,生成一个java_servlet,对应的Servlet文件中已经包含了被包含的页面,然后javac编译成一个cl

Without SSH/JSP/Servlet,不走寻常路,Java可以更酷

不过此文并不是用来批判SSH(Struts.Spring.Hibernate)/JSP/Servlet的, 也不是为某品牌做广告,而是用来分享这将近一年来的研究心得. 去年圣诞节时曾在JavaEye发过一两篇文章,不过现在找不到了, 文章内容提到要在3个月左右的时间内设计出一个有别于SSH的新型MVC框架, 设计的起点最初是以JSP/Servlet为基础的,虽然在两个多月后有了个雏形, 但是跟Rails这样的框架相比还是没有明显的优势, 比如在不使用反射的情况下, 很难将不同的uri对应到Ser

【Hibernate学习笔记】第二章节:JSP/Servlet及相关技术详解

JSP(Java Servr Page)和Servlet是Java EE规范的两个基本成员,他们是Java Web开发的重点知识,也是Java EE开发的基础知识.JSP和Servlet的本质是一样的,因此JSP最终必须编译成Servlet才能运行,或者说JSP只是生成Servlet的"草稿"文件.JSP的特点是在HTML页面中嵌入了Java代码片段,从而可以动态的提供页面内容. 1.Web应用和web.xml文件 JSP.Servlet.Listener和Filter等都必须运行在W

JSP/Servlet程序设计(入门书籍)

Web开发技术 1. 静态开发技术: (1)HTML      HTML是网站开发最基本的语言,是WEB的核心.所有后续的WEB开发技术都以HTML为基础. (2)CSS      CSS(Cascading Style Sheet)级联样式表. (3)JavaScript      JavaScript是一种基于对象和事件驱动的脚本语言.JavaScript程序可以直接嵌入HTML页面,作为一种客户端程序,允许用户与其进行交互. 2. 动态网页技术: 主要有ASP.ASP.NET.PHP和JS

javaweb之JSP+Servlet

javaweb之JSP+Servlet 使用java开发web项目时,可以在后端使用Servlet,前端使用JSP,下面就介绍一下这两者的配合使用. Servlet Servlet的概念其实很简单,本质是一个遵从Servlet开发出来的java类.运行在 Web 服务器或应用服务器,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 图片来自https://www.runoob.com JSP JSP(全称Java Server Pa

jsp中include的两种方式

一.前言 身为一名coder有太多太多的知识点要去学,太多太多的东西要去记.往往一些小细节也就难免疏忽,但悲催的是多数困恼你的bug就是因为这些微不足道的知识点.我们又不是机器人,怎么可能什么都记得了呢.更多的是遇到问题->解决问题->成为经验,这种提升模式.其实多去交流,多去分享,在你还未遇到问题之前就能预先知晓解决方法,或许提升的更快. 二.JSP中include的两种方法 1.include指令: <%@include file="文件的绝对路径或者相对路径"%

代替jquery $.post 跨域提交数据的N种形式

跨域的N种形式: 1.直接用jquery中$.getJSON进行跨域提交 优点:有返回值,可直接跨域: 缺点:数据量小: 提交方式:仅get (无$.postJSON) $.getJSON("http://www.sendnet.cn/?callback=?" , { UserId: 1001 }, function (data) { alert(data.info); }); $.ajax({ type: "Get", url: "http://www.