前言
本章讲解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()方法: