Servlet进阶(一)第一个JSP页面

版权声明:程序猴jwang版权所有 https://blog.csdn.net/qq_21046965/article/details/84349023

前言

      本章讲解JSP的相关知识之JSP初步

方法

1.概念

在以前我们写网页的时候,都是用html进行书写,这种网页是静态的,无法和服务器进行一个交互,那么怎么办呢?JSP技术应运而生,我们在web开发之中,Java和Jsp可以形成完美的配合,使得html网页功能更加丰富,下面看一下百度的概念:

JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 [1]  是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

从上面的描述中我们可以发现,其本质上还是使用html。

2.第一个JSP文件

相信大家已经看出来了,之前的示例中我用到了一个登录页面,其就是JSP页面。

我们可以使用IDEA新建一个JSP页面,查看它的组成:

它实质上是这样的:

<%--
  Created by IntelliJ IDEA.
  User: jwang
  Date: 2018/11/22
  Time: 21:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    My First JSP Page
</body>
</html>

 除了<%%>包围的数据,下面都是纯粹的html语句,这样你就创建了第一个JSP页面!

我们启动tomcat,对这个页面进行访问!

看到这里,我跟你讲,JSP其实不难,你要是会HTML的相关知识,你已经学会一半了! 

附录

一、Servlet编写精要

我们知道,执行servlet时我们一直使用的时doPost()方法和doGet()方法来处理前台过来的各种请求。其实,我们可以直接通过service()方法直接接收所有请求类型。

更改前面的servlet代码如下:

package com.jwang.student.servlet;

import com.jwang.student.bo.User;
import com.jwang.student.service.UserService;
import com.jwang.student.service.impl.UserServiceImpl;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/login.do")
public class UserServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            ServletContext servletContext = request.getSession().getServletContext();
            request.setCharacterEncoding("UTF-8");
            UserService userService = new UserServiceImpl();
            User user = new User("01", username, password);
            if (userService.login(user)) {
                servletContext.setAttribute("username",username);
                response.sendRedirect("/success.jsp");
            } else {
                request.getRequestDispatcher("/login.jsp").forward(request, response);
            }
        }catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

该方法可以处理前台的各类请求,我们以后就用这个啦!

如果对于post和get请求有单独的处理方式,可以选择之前的方法来进行编写!

二、JSP原理介绍

从百度的相关介绍我们不难发现,JSP是一个简要的Servlet,接下来听我慢慢分析!

拿之前的first.jsp为例,当我们访问localhost:端口号/first.jsp的时候,其默认执行了一个Servlet!

有同学可能糊涂了,这明明就是一个页面啊,道理上跟访问页面应该没有什么区别啊!其实不然!

各位请看,访问.jsp文件实质上是走了如下的servlet,打开我们的tomcat目录下的web.xml

这就一目了然了,当我们执行first.jsp实际上执行了这个servlet:

这个Servlet的作用在于将我们的jsp文件转化为Java文件,其实质上是转化为了一个Servlet:

让我们看一下转化后的first.jsp,打开tomcat路径下的work文件夹,大概路径为:work\Catalina\localhost\ROOT\org\apache\jsp

不难发现,我们的first.jsp被转化为了first_jso.java,我们打开这个java文件一探究竟:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.35
 * Generated at: 2018-11-22 13:39:38 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

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

public final class first_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  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 static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

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

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

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  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 {
      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\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("    My First JSP Page\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);
    }
  }
}


我们首先发现了这段代码:

这正是Servlet反馈给用户的页面啊!也就是我们之前看到的那个!

疑问:既然是小型化的Servlet,那么应该继承HttpServlet并重写service()方法啊,可是我们并没有看到!

但是我们发现了下面的代码:

 我们抱有一丝希望的认为,它的父类应该继承了相关类并且重写了方法!让我们去父类看一下吧!
打开tomcat目录下的lib文件夹,使用反编译工具反编译jasper.jar,找到父类:
惊喜总是在不经意间发生了!

到这里我们证明了它的确是一个小型化的Servlet!

细心的同学还可以发现,它父类的service()方法,实质上调用的是子类的_jspService()方法:

猜你喜欢

转载自blog.csdn.net/qq_21046965/article/details/84349023