您好,欢迎来到吉趣旅游网。
搜索
您的当前位置:首页Jsp和Servlet关系

Jsp和Servlet关系

来源:吉趣旅游网
Jsp和Servlet关系

为什么会出现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\"%>

Insert title here666 

被编译好的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_dependants; private static final java.util.Set _jspx_imports_packages; private static final java.util.Set _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 getDependants() { return _jspx_dependants; }

public java.util.Set getPackageImports() { return _jspx_imports_packages; }

public java.util.Set 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. 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(\"\\r\\n\");

out.write(\"\\r\\n\"); out.write(\"Insert title here\\r\\n\"); out.write(\"\\r\\n\"); out.write(\"\\r\\n\"); out.write(\"666\\r\\n\"); 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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务