原文:https://www.cnblogs.com/xuedexin/articles/5625533.html
这个是说jsp运行机理的:https://blog.csdn.net/hanxuemin12345/article/details/23831645
感觉原文写的还是有点深,比较全,我只是懂了一点点,但是这个问题也大致解决了,写下的思路是以这个问题为中心的
jsp运行流程:
1)首先,客户端发出请求(request ),请求访问JSP网页
2)接着,JSP Container将要访问的.JSP文件 转译成Servlet的源代码(.java文件)
3)然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行
4)最后把结果响应(response )给客户端
jsp内置对象使用时不需声明的原因
首先知道,jsp内置对象不用声明的原因是,在jsp文件转译成java文件时,会自动声明HttpServletRequest、HttpServletResponse,还有其他的内置对象,据说是因为使用次数多,为了方便才自动声明的。
jsp内置对象不能在jsp声明中使用的原因
在转译过程中,jsp文件的声明原封不动的移到了java文件中(在原文件中就是一个方法或变量),成了java文件的一个方法或变量。而不在声明中的jsp程序段也被封装到了一个名叫_jspService的方法中,HttpServletRequest、HttpServletResponse作为方法的参数生成,其他内置对象在方法执行过程中生成。最后,才会执行原jsp文件中的程序段。
总结一句,jsp声明九大内置对象是在原文件的jsp声明(即<%! % >)之后,没有事先声明当然不能使用了
所以jsp内置对象不用声明和创建就可以在jsp文件中使用,但是不能写在声明中。
一个小小的解决办法
如果实在想在声明里边用application或config,可以这样写,相当于声明了一下,别的内置对象在声明里的写法还没有探索出来
ServletContext application=getServletContext();
ServletConfig config =getServletConfig();
不要问我为什么非要在声明里用内置对象。。。web实验的网页计数器,老师就在声明里用了application还真运行通了?????我一度以为自己写错了
附上神秘的_jspService()函数:
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.getDispatcherType())) {
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;
}
如果想看看自己的jsp文件生成的java文件但是找不到,可以参考这篇文章:
https://blog.csdn.net/han_hhh/article/details/102905750