jsp的运行原理

JSP(JavaServer Pages)允许开发者在HTML中嵌入Java代码,以简化前端与后端交互。当浏览器请求JSP文件时,服务器首先查找对应的servlet,由于未在web.xml中定义,会遵循Tomcat的默认配置,将.jsp请求映射到JspServlet。JspServlet负责将JSP转换为servlet(如_1_jsp.java),然后执行该生成的servlet的_jspService方法,而非原始的JSP文件。整个过程揭示了JSP的动态生成和执行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写servlet时,如果需要展示一个页面,就需要在servlet里面写HTML的代码,比如这段代码,直接访问这个servlet,就会显示一个登陆页面。但是这样写过于麻烦,里面的HTML代码被当做字符串由服务器一句句响应到浏览器,写起来费劲。
public class PageServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		//设置响应编码格式
		resp.setContentType("text/html;charset=utf-8");
		//响应处理结果
			//获取request作用域数据
			String str = (String) req.getAttribute("str")==null?"":(String) req.getAttribute("str");
			resp.getWriter().write("<html>");
			resp.getWriter().write("<head>");
			resp.getWriter().write("</head>");
			resp.getWriter().write("<body>");
			//当request对象中有str信息时,将其显示   没有就是空字符串
			resp.getWriter().write("<font color='red' size='20px'>"+str+"</font>");
			//通过get方式  提交到login的servlet
			resp.getWriter().write("<form action='login' method='get'>");
			resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
			resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
			resp.getWriter().write("<input type='submit'  value='登录'/><br/>");
			resp.getWriter().write("</form>");
			resp.getWriter().write("</body>");
			resp.getWriter().write("</html>");
	}
}

所以有了jsp,可以让我们直接写前端的一些脚本语言,而不用在servlet里面用响应那样写。新建一个web项目,webroot下新建一个名为1.jsp的文件,如下


当我们在浏览器直接访问这个项目时http://localhost:8086/jsp/1.jsp   (jsp是我的虚拟项目名),会打印body里的东西。

但是我们要知道,服务器只认识servlet,我们请求到时,服务器会先去jsp项目下的web.xml找一个1.jsp的servlet,发现没有。(服务器认为1.jsp是一个servlet的别名).

没有后,会再去tomcat下的conf下的web.xml中找1.jsp的一个servlet(tomcat下的web.xml中配置的是公共的),它找到这样的配置,以.jsp结尾的url,通过这个它找到servlet-name为jsp,最后找到了JspServlet。

JspServlet的很重要的一个功能就是将一个.jsp文件转义为一个servlet文件。比如项目下的1.jsp文件,对应的是在这个目录下apache-tomcat-7.0.86\work\Catalina\localhost\jsp\org\apache\jsp转义后的名为_1_jsp.java的servlet文件。其实服务器执行的就是这个转义后的文件。

但是服务器执行servlet会找到service去执行,转义后的文件是没有service的,只有_jspService,我们会发现它继承了extends org.apache.jasper.runtime.HttpJspBase,在该父类中我们可以看到它调用了_jspService


所以,我们服务器执行的并不是我们项目下的1.jsp文件,而是经过转义后的_1_jsp.java文件,从始至终服务器都不认识1.jsp文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值