为什么会出现Jsp?
其实对于服务器来说它只认识Servlet,我们完全可以在Servlet⽤resp.getWriter().write(\"\");画出⽹页的界⾯,但是仅仅⼀个很简单的界⾯就要重复的书写resp.getWriter().write(\"\"),并且这还没有加上js、css以及jquery。
但是我们在Servlet写的是java代码可以有逻辑的判断,但是在html、css中⽆法加⼊逻辑导致页⾯是静态的。为了解决这⼀问题出现了jsp,在jsp中可以书写Java代码、js代码、html代码等。
我们都知道浏览器发送请求到服务器,服务器通过解析其中Servlet的别名找到对应的Servlet并执⾏其中的service⽅法做出处理和响应,那么对于服务器来说它只认识Servlet,那么我们编辑的Jsp到底是如何被服务器识别的?
实际上服务器还是将.jsp当作Servlet的别名在你局部配置下的web.xml找有没有对应的Servlet,如果没有找到对应的Servlet就去Tomcat的公共配置下的web.xml(Tomcat安装⽬录conf下的web.xml)找对应的Servlet。会找到如下内容:
org.apache.jasper.servlet.JspServlet将对应的jsp⽂件转为Servlet。
那么转的Servlet在什么地⽅呢?打开Tomcat下的work⽂件夹⼀直点到:找你正在运⾏的项⽬的jsp测试的jsp:
<%@ page language=\"java\" contentType=\"text/html; charset=utf-8\" pageEncoding=\"utf-8\"%>
被编译好的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 org.apache.jsp;import javax.servlet.*;
import javax.servlet.http.*;import javax.servlet.jsp.*;
public final class index_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 _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 public java.util.Set public java.util.Set 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. 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=ISO-8859-1\"); 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(\"\\r\\n\"); out.write(\" out.write(\"\\r\\n\"); out.write(\" } 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); } }} 但是我们发现这个类并没有继承HttpServlet⽽是继承了org.apache.jasper.runtime.HttpJspBase并且⾥⾯也没有service⽅法⽽是_jspservice⽅法。那么Tomcat就会到它的⽗类中找service⽅法并进⾏调⽤。 实际上它的⽗类org.apache.jasper.runtime.HttpJspBase继承了HttpServlet。 ⽗类中Service⽅法就是调⽤了⼦类的_jspservice⽅法(所以说实际上Tomcat执⾏的就是_jspservice⽅法) 总结:实际上jsp的本质还是servlet,只不过是为了⽅⾯花界⾯所单独拉出来的⼀部分⽽已,到最终的实现还是会回到Servlet当中。 展望:jsp已经是⼀门⽐较落后的技术来,因为html、css、js是前端写的,⽽后端要在其中加⼊逻辑判断,那么⾸先你⼀定得认识前端语⾔的代码,否则你如何嵌套?这样很不利于前 后端的分离。之所以学习是因为很多框架和项⽬中依然会⽤到它,但是最终还是会被时代所淘汰。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- jqkq.cn 版权所有 赣ICP备2024042794号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务