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文件。