2023年11月28日发(作者:)

JspServlet关系

为什么会出现Jsp

其实对于服务器来说它只认识Servlet,我们完全可以在Servletter().write("");画出⽹页的界⾯,但是仅仅⼀个很简单的界⾯就要重复的书写ter().write(""),并

且这还没有加上jscss以及jquery

但是我们在Servlet写的是java代码可以有逻辑的判断,但是在htmlcss中⽆法加⼊逻辑导致页⾯是静态的。为了解决这⼀问题出现了jsp,在jsp中可以书写Java代码、js代码、html

码等。

我们都知道浏览器发送请求到服务器,服务器通过解析其中Servlet的别名找到对应的Servlet并执⾏其中的service⽅法做出处理和响应,那么对于服务器来说它只认识Servlet,那么我

们编辑的Jsp到底是如何被服务器识别的?

实际上服务器还是将.jsp当作Servlet的别名在你局部配置下的找有没有对应的Servlet,如果没有找到对应的Servlet就去Tomcat的公共配置下的Tomcat安装⽬录

conf下的)找对应的Servlet

会找到如下内容:

vlet将对应的jsp⽂件转为Servlet

那么转的Servlet在什么地⽅呢?打开Tomcat下的work⽂件夹⼀直点到:找你正在运⾏的项⽬的jsp

测试的jsp

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

Insert title here

666

被编译好的Java⽂件:

/*

* Generated by the Jasper component of Apache Tomcat

* Version: Apache Tomcat/8.5.46

* Generated at: 2019-10-16 09:05:10 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 ;

import t.*;

import .*;

import .*;

public final class index_jsp extends pBase

implements rceDependent,

rceImports {

private static final tory _jspxFactory =

aultFactory();

private static <,> _jspx_dependants;

private static final <> _jspx_imports_packages;

private static final <> _jspx_imports_classes;

static {

_jspx_imports_packages = new t<>();

_jspx_imports_("t");

_jspx_imports_("");

_jspx_imports_("");

_jspx_imports_classes = null;

}

private volatile sionFactory _el_expressionfactory;

private volatile ceManager _jsp_instancemanager;

public <,> getDependants() {

return _jspx_dependants;

}

public <> getPackageImports() {

return _jspx_imports_packages;

}

public <> getClassImports() {

return _jspx_imports_classes;

}

public sionFactory _jsp_getExpressionFactory() {

if (_el_expressionfactory == null) {

synchronized (this) {

if (_el_expressionfactory == null) {

_el_expressionfactory = _ApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();

}

}

}

return _el_expressionfactory;

}

public ceManager _jsp_getInstanceManager() {

if (_jsp_instancemanager == null) {

synchronized (this) {

if (_jsp_instancemanager == null) {

_jsp_instancemanager = tanceManager(getServletConfig());

}

}

}

return _jsp_instancemanager;

}

public void _jspInit() {

}

public void _jspDestroy() {

}

public void _jspService(final rvletRequest request, final rvletResponse response)

throws ption, tException {

final _jspx_method = hod();

if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !(request.

ror(_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");

return;

}

final ntext pageContext;

ssion session = null;

final tContext application;

final tConfig config;

ter out = null;

final page = this;

ter _jspx_out = null;

ntext _jspx_page_context = null;

try {

tentType("text/html; charset=ISO-8859-1");

pageContext = _eContext(this, request, response,

null, true, 8192, true);

_jspx_page_context = pageContext;

application = vletContext();

config = vletConfig();

session = sion();

out = ();

_jspx_out = out;

("rn");

("rn");

("rn");

("rn");

("rn");

("Insert title herern");

("rn");

("rn");

("666rn");

("rn");

("");

} catch (ble t) {

if (!(t instanceof geException)){

out = _jspx_out;

if (out != null && ferSize() != 0)

try {

if (itted()) {

();

} else {

uffer();

}

} catch (ption e) {}

if (_jspx_page_context != null) _jspx_page_PageException(t);

else throw new ServletException(t);

}

} finally {

_ePageContext(_jspx_page_context);

}

}

}

但是我们发现这个类并没有继承HttpServlet⽽是继承了pBase并且⾥⾯也没有service⽅法⽽是_jspservice⽅法。那么Tomcat就会到它的⽗类中找

service⽅法并进⾏调⽤。

实际上它的⽗类pBase继承了HttpServlet

⽗类中Service⽅法就是调⽤了⼦类的_jspservice⽅法(所以说实际上Tomcat执⾏的就是_jspservice⽅法)

总结:实际上jsp的本质还是servlet,只不过是为了⽅⾯花界⾯所单独拉出来的⼀部分⽽已,到最终的实现还是会回到Servlet当中。

展望:jsp已经是⼀门⽐较落后的技术来,因为htmlcssjs是前端写的,⽽后端要在其中加⼊逻辑判断,那么⾸先你⼀定得认识前端语⾔的代码,否则你如何嵌套?这样很不利于前

后端的分离。之所以学习是因为很多框架和项⽬中依然会⽤到它,但是最终还是会被时代所淘汰。