深入探索Servlet

在讨论Servlet之前,我们先来看看JSP运行机制:服务器运行JSP时候,底层是将JSP编译成为java类文件来运行的,这种类文件就是Servlet

那么我们可不可以直接编写Servlet类呢?

1. 当我们在JSP里面写大量Java代码时,可以把Java代码分离到Servlet中。

2. 当我们希望程序运行得快一些时,可以使用Servlet

下面讨论一下Servlet的生命周期

当客户端发送请求(Request)到Servlet中,Servlet第一次运行的时候会调用init()方法,然后调用service()doGet()doPost()方法,如果此时有第二个客户端再来访问这个Servlet,将直接调用service()doGet()doPost()方法,这些方法是采用多线程的方法实现以便能够让多个用户同时访问,当服务器关闭的时候,Servlet消亡,会自动调用destroy()方法。

Servlet生命周期实例

编写Servlet1.javaServlet类,实现测试Servlet的生命周期,代码如下

 在web.xml中注册上面的Servlet类,配置代码如下

 然后启动服务器,在浏览器地址栏中输入:http://localhost:8080/ServletPro/servlet/Servlet1,运行结果如下

构造函数

初始化函数

doGet

从结果可以看出Servlet的执行过程,如果再次刷新页面,相当于另外一个客户端来访问,此时只会得到doGet的输出结果,由此说明初始化函数是第一次运行Servlet的时候才会被调用,然后停止服务器,会得到消亡函数的输出结果,说明调用了消亡函数。

如何在Servlet中访问JSP的内置对象

request:就是参数中的request

response:就是参数中的response

session:利用request.getSession()方法。

application:利用getServletContext()方法。

编写Servlet2.javaServlet类,实现在Servlet中访问JSP的内置对象(九九乘法表的实现),代码如下

 运行结果将得到一个九九乘法表。

Servlet应该负责的怎样的工作?

上面程序存在一个问题,就是显示九九乘法表是在Servlet中实现的,一般情况下Servlet是负责动作或控制逻辑,而对于显示功能就应该使用JSP。但是Servlet最好不要有当量的逻辑,这样会造成Servlet很庞大,并且功能很混杂,这个时候就应该使用JavaBean来实现部分的逻辑。

下面介绍几种Servlet的高级用法

1. 实现页面的跳转。

2. 读取web.xml中的初始化参数。

3. 实现过滤器。

Servlet内实现页面跳转

编写含有表单的JSP页面,form.jsp,代码如下

 编写结果页面result.jsp,代码如下

 编写负责跳转用的Servlet类,Servlet3.java,首先采用重定向的方法

 运行form.jsp页面,点击提交按钮,将跳转到result.jsp页面中,由于上面采用的重定向的方法,所以跳转之后,地址栏上的url地址也发生了变化。

使用重定向方法进行跳转时,存在一个问题,就是在结果页面得不到request中的内容,包括参数和属性。

Servlet3.java中的doGet方法中添加代码,测试能否得到request的内容

 运行form.jsp页面,输入消息,点击提交按钮,将跳转到result.jsp页面中,这时在控制台上得到正确的结果,但是在result.jsp中得不到request中的内容,结果页面中request内容丢失。

下面使用forward跳转方法,这种方法不会丢失request中的内容,在doGet方法添加相应代码,doGet方法如下

 读取web.xml中的参数

web.xml中可以定义两种形式的参数,全局参数和局部参数

读取全局参数

 

web.xml中定义全局参数,代码如下

 在Servlet中读取全局参数的代码可以编写在doGet方法,doGet方法代码如下

 读取局部参数

web.xml中定义局部参数,代码如下

 在doGet读取参数的代码如下

 实现过滤器

过滤器能使每次提交(广义,所有的getpost提交)的时候自动做一些事情。

如何编写过滤器?

1.编写一个类,实现javax.servlet.Filter。

2.编写doFilterFilterChain.doFilter(request, response)。

3.web.xml中注册这个过滤器。

<filter>

<filter-name>名称</filter-name>

<filter-class></filter-class>

</filter>

<filter-mapping>

       <filter-name>名称</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

案例:利用过滤器解决中文问题

编写过滤器类,EncodingFilter.java,实现解决中文问题,代码如下

 在web.xml中注册这个过滤器,代码如下

 过滤器比较重要的作用

1. 做初始化工作,不仅仅是为过滤器本身初始化,而且可以为整个系统工作初始化工作,并且初始化工作只运行一次。

2. 每次做提交的时候(广义上的提交),doFilter()方法都会被调用,这就给我们带来比较好的作用,比如我们登录某个系统,当我们退出该系统时,直接点击浏览器上面的后退按钮,如果不做处理,就会返回到之前登录状态,这显然是不安全的。我们可以通过检查session是不是为空来控制,session为空的话就提示用户重新登录,所以要清空页面的session,这时可以使用过滤器,把要检查session的页面共同用一个过滤器来做过滤,每次访问它们之前都来检查session。只要在访问的时候要做检查的工作,我们都可以用过滤器来实现。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值