JSP学习笔记(三)--------Servlet相关及Servlet路径跳转
JSP学习笔记(三)一、什么是Servlet先有JSP还是先有Servlet?我可以很负责任的告诉大家现有Servlet。没错,JSP的前身就是Servlet。Servlet是在服务器上运行的小程序。一个Servlet就是一个Java、类,并且通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。二、Tomcat容器等级Tomcate的容器分为四个等级,
JSP学习笔记(三)
一、什么是Servlet
先有JSP还是先有Servlet?我可以很负责任的告诉大家现有Servlet。没错,JSP的前身就是Servlet。Servlet是在服务器上运行的小程序。一个Servlet就是一个Java、类,并且通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。
二、Tomcat容器等级
Tomcate的容器分为四个等级,Servlet的容器管理Context容器,一个Context对应一个Web工程。
三、Servlet生命周期
1、初始化阶段,调用init()方法。
2、响应客户请求阶段,调用service()方法。由service()方法根据提交方式选择执行doGet()或者doPost()方法。
3、销毁阶段(终止阶段),调用destroy()方法。
注意:在Servlet的整个生命周期内,init()方法只被调用一次。
四、在下列时刻Servlet容器装载Servlet
1、Servler容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的<Servlet></Servlet>之间添加如下代码:
<loadon-startup>1</loadon-startup>,数字越小表示级别越高。
2、在Servlet容器启动后,客户首次向Servlet发送请求。
3、在Servlet类文件被更新后,重新装载Servlet。
五、Servlet获取九大内置对象
Servlet与九大内置对象
JPS对象 |
怎样获得 |
out |
resp.getWriter |
request |
service方法中的req参数 |
response |
service方法中的resp参数 |
session |
req.getSession()函数 |
application |
getServletContext()函数 |
exception |
Throwable |
page |
this |
pageContext |
pageContext |
config |
getServletConfig函数 |
六、Servlet与表单
通过表单的post或get方式,提交到action指向的servlet,然后再servlet中使用request.getParameter(参数)来获取表单传递过来的值,当表单中有复选框等多个值的情况,使用request.getParameterValues(参数)来获取复选框按钮的值。
七、Servlet中service()方法
在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet ,doPost,但是查看API时我们会发现Servlet接口,GenericSevlet抽象类 以及HttpServlet类中都有service方法,那么为什么我们继承HttpSevlet类时不要重写service 而要重写doGet doPost呢?service的作用是什么捏?
正如上文中所说的,Servlet中,service方法是一直存在的,因为最高层的接口Servlet(像HttpServlet等具体的servlet都是直接或者间接实现了这个接口)里面就有这个方法,所以不管是怎样的servlet类,都有service方法,没有service就不能称为一个Servlet了。
而对于service方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGet,doPos以及其他的doXXXt方法,也就是说service是用来转向的,所以我们一般写一个servlet,只需要重写doGet或者doPost就可以了。如果重写了service方法,那么servlet容器就会把请求交给这个方法来处理,倘若你重写的service方法没有调用doXXX,即使你在Servlet中又重写了其他doGet doPost等也是不会被调用的,因为Servlet的service被自动调用(就像init destory一样),所以如果你由于某种需要,需要重写service方法,并且更具不同的method调用doPost doGet等时,就要在末尾加上一句super.service(),这样就可以解决问题了。
通过API可以看到在HttpServlet类中的两个service方法:service(ServletRequest, ServletResponse)方法是重写的其父类GenericServlet类的方法,这个方法是公共的(public),其作用是接受客户端的请求并将其传递给service(HttpServletRequest, HttpServletResponse)方法;service(HttpServletRequest, HttpServletResponse)方法是HttpServlet类定义的方法,是受保护的(protected),主要作用是接受标准的Http请求(HttpServletRequest),并根据请求方式不同分发到不同的doXXX(HttpServletRequest, HttpServletResponse)方法。 这就是HttpServlet有两个service方法的原因了。一般情况下我们的Servlet只需重写受保护的service方法就够了。
八、Servlet路径跳转
1、绝对路径:放之四海而皆准的路径
2、相对路径:相对当前资源的路径
在超链接的跳转路径中,/servlet/HelloServlet这样写的话是错误的,第一个/代表的是服务器的根目录应该为<ahref="servlet/HelloServlet">访问HelloServlet</a>否则页面会返回404状态码。表单中action的URL地址写法,与超链接方式完全相同。
而在web.xml中的<url-pattern>/servlet/HelloServlet</url-pattern>必须以/开头,这里的/表示的是当前项目的根目录。如下:
<servlet-mapping>
<servlet-name> HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
在Servlet跳转到页面是,有两种方法,一种是请求重定向,还有一种是请求转发
a、如请求重定向跳转到test.jsp(在WebRoot目录下)可以写成如下形式:
response.sendRedirect(request.getContextPath()+"/test.jsp");
其中request.getContextPath()是获得上下文对象
b、如服务器内部跳转(请求转发)可以写成如下形式:
request.getRequestDispatcher("../test.jsp").forward(request,response);
更多推荐
所有评论(0)