Servlet使用配置

1. Servlet使用配置

创建Servlet需要首先需要创建一个Servlet类,并且这个类需要继承HttpServlet,然后重写doGet()/doPost()方法实现业务逻辑流程。TestServlet.java代码如下:

public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("进入TestServlet。。。。。。。。。。。。。。。");
}
public void destroy() {
// TODO Auto-generated method stub
System.out.println("销毁TestServlet。。。。。。。。。。。。。。。");
} 
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("调用service()方法。。。。。。");
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.append("welcome to  ****");
//out.write("welcome to  ****");
//out.println("welcome to  ****");
out.flush();//缓冲区的数据强行输出
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用doGet()方法。。。。。。。。。。。。");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用doPost()方法.................");
}
}

其次需要配置Web.xml文件,在该文件中指定自定义的Servlet的信息即可。Web.xml中Servlet的配置信息如下:

 <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.hyg.servlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>

注意:
是自定义的servlet名称(唯一); 用于指定当前servlet所在的类路径 ; 用于指定进入当前servelt时访问的url地址。

2 . Servlet声明周期

Servlet生命周期概括为以下几个阶段:

  1. 装载Servlet:这项操作一般是动态执行的,有些服务器提供了相应的管理功能,可以在启动的时候就装载Servlet;
  2. 创建一个Servlet实例:容器创建Servlet的一个实例对象;
  3. 初始化:容器调用init()方法对Servlet实例进行初始化;1
  4. 服务:当容器接收到对此Servlet的请求时,将调用service()方法响应客户的请求; n
  5. 销毁:容器调用destroy()方法销毁Servlet实例 1

3. 重定向和请求转发

3.1 重定向
重定向是指页面重新定位到某个新地址,之前的Request失效,进入一个新的Request,且跳转后浏览器地址栏内容将变为新的指定地址。重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL,其语法格式如下:

pubilc void sendRedirect(java.lang.String location)throws java.io.IOException

其中:
location参数指定了重定向的URL,它可以是相对路径也可是绝对路径。
sendRedirect()不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他应用程序中的资源,例如:

response.sendRedirect("http://www.baidu.com");

3.2 请求转发
请求转发是指将请求再转发到另一页面,此过程依然在Request范围内,转发后浏览器地址栏内容不变。请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应。
RequestDispatcher接口有两个方法:
forward()方法:请求转发,可以从当前Servlet跳转到其它Servlet;
include()方法:引入其他Servlet的内容。
RequestDispatcher是一个接口,通过使用HttpRequest对象的getRequestDispalcher()方法可以获得该接口的实例对象,例如:

RequestDispatcher rd = request.getRequestDispatcher(path);
rd.forward(request,response);

3.3 重定向和请求转发的区别
1、请求转发只能将请求转发给同一个Web应用中的组件,而重定向不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源。
2、重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发访问过程结束后,浏览器地址栏保持初始的URL地址不变。
3、请求转发的调用者与被调用者之间共享相同的request对象和response对象;而重定向的调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。

4. Session

4.1 session生命周期
Session生命周期经过以下几个过程:

  1. 客户端向服务器第一次发送请求的时候,request中并无SessionID。
  2. 此时服务器会创建一个Session对象,并分配一个SessionID。Serssion对象保存在服务器端,此时为新建状态,调用session.isNew()返回true。
  3. 当服务器端处理完毕后,会将SessionID通过response对象传回到客户端,浏览器负责保存到当前进程中。
  4. 当客户端再次发送请求时,会同时将SessionID发送给服务器。
  5. 服务器根据传递过来的SessionID将这次请求(request)与保存在服务器端的Session对象联系起来。此时Session已不处于新建状态,调用session.isNew()返回false。
  6. 循环执行过程3-5,直到Session超时或销毁。
    4.2 Session的常用方法
    4.2.1 获取session
HttpSession session=request.getSession();//获取当前Session

4.2.2 在session中存取数据
用于存取数据的方法有:
² setAttribute():用于在Session对象中保存数据,数据以Key/Value映射形式存放。
² getAttribute():从Session中提取指定Key对应的Value值。
向Session对象中保存数据的示例代码如下:

//将username保存到Session中,并指定其引用名称为uName
session.setAttribute("uName", username);

从Session中提取存放的信息,则代码如下:

//取出数据,注意:因该方法的返回数据类型为Object,所以需要转换数据类型。
String username = (String)session.getAttribute("uName");

4.2.3 销毁session
用于销毁Session的方法是:
² invalidate():调用此方法可以同时删除HttpSession对象和数据。
使用invalidate()销毁Session的示例代码如下:

//销毁Session(常用于用户注销)
session.invalidate();

5. ServletContext接口

Servlet上下文是运行Servlet的逻辑容器。同一个上下文中的所有Servlet共享存于其中的信息和属性。在Servlet API中定义了一个ServletContext接口,用于存取Servlet运行的环境或者上下文信息。ServletContext对象可以通过使用ServletConfig对象的getServletContext()方法获得,在Servlet中提供了getServletContext()方法也可以直接获得ServletContext对象。

ServletContext ctx = this.getServletContext();

ServletContext接口中定义了许多有用的方法,其中getAttribute()、setAttribute()、removeAttribute()和getInitParameter()是在Web开发中比较常用的方法。

Integer counter = (Integer) ctx.getAttribute("UserNumber");
tx.setAttribute("UserNumber", counter);

5.1 ServletContext的生命周期
ServletContext的生命周期过程如下:
1) 新Servlet容器启动的时候,服务器端会创建一个ServletContext对象;
2) 在容器运行期间ServletContext对象一直存在;
3) 当容器停止时,ServletContext的生命周期结束。
5.2 ServletContext的配置和使用
Web.xml的配置信息如下:

 <!-- servletContext初始化配置 -->
   <context-param>   
<param-name>url</param-name>   
<!--<param-value>jdbc:mysql://localhost:3306/servlet</param-value>  -->
<param-value>jdbc:oracle:thin:@localhost:1521:orcl</param-value>
</context-param>
   <context-param>   
<param-name>driver</param-name>   
<param-value>com.mysql.jdbc.Driver/oracle.jdbc.driver.OracleDriver</param-value>   
</context-param>
  <context-param>   
  <param-name>user</param-name>   
  <param-value>yjx</param-value>   
   </context-param>      
<context-param>   
 <param-name>password</param-name>   
 <param-value>yjx123</param-value>   
 </context-param>   

TestServletContextServlet.java中的代码如下:

// 获得ServletContext对象
ServletContext ctx = this.getServletContext();
// 获得web.xml中设置的初始化参数   连接数据库的基本信息
String url = ctx.getInitParameter("url");
url = url + "?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull";
String driver = ctx.getInitParameter("driver");
String user = ctx.getInitParameter("user");
String password = ctx.getInitParameter("password");

6. 监听器

Servlet监听器的作用是监听Servlet应用中的事件,并根据需求作出适当的响应。Listener接口和Event类
监听对象 Listener Event
监听Servlet上下文 ServletContextListener ServletContextEvent
ServletContextAttributeListener ServletContextAttributeEvent
监听Session HttpSessionListener HttpSessionEvent
HttpSessionActivationListerner
HttpSessionAttributeListener HttpSessionBindingEvent
HttpSessionBindingListener
监听Request ServletRequestListener ServletRequestEvent
ServletRequestAttributeListener ServletRequestAttributeEvent
6.1 监听器配置
在web.xml中配置监听器的格式如下:

<listener>
<listener-class>监听类</listener-class>
</listener>

例如:

com.hyg.listener.OnlineSessionListener

6.2 监听器的使用
以监听session为例,统计当前在线人数,创建一个监听器,实现HttpSessionListener接口,并重写接口方法,具体代码如下所示:

public class OnlineSessionListener implements HttpSessionListener {
private static long  onlineNumber = 0;//在线人数
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("在线人数监听启动....");
onlineNumber++;
//设置当前session最大生效时间
//se.getSession().setMaxInactiveInterval(5);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("在线人数监听销毁....");
onlineNumber--;
}
public static long getOnlineNumber() {
return onlineNumber;
}
}

当在服务器启动的时候就会触发监听器,此时会调用sessionCreate()方法,当用户关闭浏览器并且session有效时间过期的时候,才会触发 sessionDestroye()方法。

7. 过滤器

过滤器(Filter)技术是Servlet 2.3规范新增加的功能,作用是用于过滤、拦截请求或响应信息,可以在Servlet或JSP页面运行之前和之后被自动调用,从而增强了Java Web应用程序的灵活性。
7.1 过滤器的过滤过程

当用户发送请求后,运行的步骤如下:

  1. 浏览器根据用户的请求生成HTTP请求消息,并将其发送给Web容器。
  2. Web容器创建针对该次访问的请求对象(request)和响应对象(response)。请求对象中包含了HTTP的请求信息,响应对象用于封装将要发送的HTTP响应信息,此时的响应对象中的内容为空。
  3. Web容器在调用Web组件之前(Servlet、JSP或HTML)把request对象和response对象传递给过滤器。
  4. 过滤器对request对象进行处理(如获取请求的URL等),一般不对response对象进行处理。
  5. 过滤器把处理后的request对象和可能没有处理的response对象传递给Web组件。
  6. Web组件调用完毕后,再次经过该过滤器,此时过滤器可能对response对象进行特殊处理(如设置响应报头或内容压缩等操作)。
  7. 过滤器把response对象传递给Web容器。
  8. Web容器把响应的结果传递给浏览器,并由浏览器显示响应结果。
    在实际的应用中,可以使用过滤器来完成以下任务:
    ² 访问特定资源(HTML、JSP页、Servlet)时的身份认证,禁止用户非法访问;
    ² 应用程序级资源的访问审核和记录;
    ² 应用程序范围内对资源的加密访问,它建立在定制的加密方案基础上;
    对被访问资源的及时转换,包括从Servlet和JSP的动态输出等。
    7.2 过滤器配置
    在Web.xml中添加如下配置信息:
 <!-- 过滤器配置 -->
  <filter>
    <display-name>LoginFilter</display-name>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.hyg.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

注意: /* 表示拦截所有url路径。

7.2 过滤器的使用
要创建一个过滤器,必需要实现Filter接口,并实现接口中的方法。以URL地址过滤为例,其实现代码如下:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//剔除不需要过滤的页面
String path = req.getRequestURI();
req.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
if (path.endsWith("login.jsp") || path.endsWith("login.action") || path.endsWith("register.jsp") || path.endsWith("register.action")) {
chain.doFilter(req, resp);
return;
}
//校验是否登录用户
HttpSession session = req.getSession();
String userName = (String)session.getAttribute("userName");
if(StringUtils.isEmpty(userName)){
resp.sendRedirect("login.jsp");
return;
}
chain.doFilter(req, resp);
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pei你看雪 .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值