2023年11月28日发(作者:)
Jsp和Servlet关系
为什么会出现Jsp?
其实对于服务器来说它只认识Servlet,我们完全可以在Servlet⽤ter().write("");画出⽹页的界⾯,但是仅仅⼀个很简单的界⾯就要重复的书写ter().write(""),并
且这还没有加上js、css以及jquery。
但是我们在Servlet写的是java代码可以有逻辑的判断,但是在html、css中⽆法加⼊逻辑导致页⾯是静态的。为了解决这⼀问题出现了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"%>
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");
("
("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已经是⼀门⽐较落后的技术来,因为html、css、js是前端写的,⽽后端要在其中加⼊逻辑判断,那么⾸先你⼀定得认识前端语⾔的代码,否则你如何嵌套?这样很不利于前
后端的分离。之所以学习是因为很多框架和项⽬中依然会⽤到它,但是最终还是会被时代所淘汰。


发布评论