码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-08-30 23:11:08      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:

        在上篇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架构。






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

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

标签:

原文地址:http://blog.csdn.net/u010928364/article/details/48048383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!