Servlet技术

Servlet技术


Servlet(Server Applet)

是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

jsp是最早支持Servlet协议的;

什么是Servlet

  • Servlet是 JavaEE 规范之一。规范就是接口
  • Servlet就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
  • Servlet是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端

Servlet在普遍使用的MVC模式的Web开发中仍占据了重要地位,目前流行的Web框架基本上都基于Servlet技术,如Struts1、WebWork、Struts2和Spring MVC等。只有掌握了Servlet,才能真正掌握JavaWeb编程的核心和精髓。

Servlet 的生命周期

  • Servlet生命周期是指Servlet实例从创建到响应客户请求,直至销毁的过程。

  • Servlet程序本身不直接在Java虚拟机上运行,由Servlet容器负责管理其整个生命周期。

  • 在Servlet生命周期中,会经过创建、初始化、服务可用、服务不可用、处理请求、终止服务、销毁七种状态。

  • Servlet生命周期可分为四个阶段:加载、(创建)、实例化、初始化、处理请求、销毁。

    (1)加载:Servlet容器(Tomcat)通过类加载器加载servlet文件(.class)
    (2)创建:通过调用servlet构造函数创建一个servlet对象
    (3)初始化:调用init方法初始化
    (4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
    (5)卸载:调用destroy方法让servlet自己释放其占用的资源
    servlet是由Servlet容器负责加载Servlet类,创建Servlet对象并实例化,然后调用Servlet的init方法,进行初始化,之后调用Service方法。实例化和初始化不同。先实例化,再初始化。 
    

1、执行 Servlet 构造器方法
2、执行 init 初始化方法
- 第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。

3、执行 service 方法

  • 第三步,每次访问都会调用

4、执行 destroy 销毁方法

  • 第四步,在 web 工程停止的时候调用。

Servlet的创建和配置

servlet可以使用web.xml文件进行配置;(配置结构比较清晰;但是繁琐,不推荐使用)

servlet在3.0之后支持使用注解的方式进行配置;(推荐使用)

注意:
对于同一个Servlet的配置方式只能使用一种,不能同时使用两种;也就是使用了注解,就不要在使用web.xml对同一个Servlet进行配置;

手动实现 Servlet 程序

1、编写一个类去实现 Servlet 接口

2、实现 service 方法,处理请求,并响应数据

3、到 web.xml 中去配置 servlet 程序的访问地址

public class HelloServlet implements Servlet {
/**
* service 方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequestservletRequest,ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet 被访问了");
  }
}

Servlet的注解配置

从Servlet3.0开始支持注解配置;

@WebServlet(
	name = "XXServlet", urlPatterns = { "/XX" },
	initParams = { @WebInitParam(name = "username", value = "qst") },
	loadOnStartup = 0, asyncSupported = true,
	displayName = "XXServlet",description="Servlet样例"
	)

相对路径与绝对路径

在 javaWeb 中,路径分为相对路径和绝对路径两种:
相对路径是:
. 表示当前目录
.. 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
1、绝对路径
2、base+相对
web中 / 斜杠的不同意义
/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杠</a>
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1</url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/

servlet的转发和重定向

Servlet中使用转发和重定向可以跳转到view层的一个jsp页面,也可以跳转到一个新的Servlet路径url;

Servlet中转发和重定向的异同点

相同点:
都进行视图跳转;
都可以访问session级别的缓存;

不同点:
转发:转发前后是同一次request请求,可以访问request级别缓存的值;
转发跳转页面之后,浏览器中的url地址不变;
通过request进行方法调用;也就是转发的动作发出者是request;

重定向:重定向前后是两次不同的request请求,不可以访问request级别缓存的值;
重定向跳转页面之后,浏览器中的url地址是新跳转的页面的路径地址;
通过response进行方法调用;也即是重定向动作的发出者是response;


核心接口概述

ServletConfig接口

其中的方法主要可以访问两项内容:Servlet初始化参数和ServletContext对象。

ServletContext接口

代表当前Servlet运行环境,Servlet容器在启动一个Web应用时,会为该应用创建一个唯一的ServletContext对象供该应用中的所有Servlet对象共享,Servlet对象可以通过ServletContext对象来访问容器中的各种资源。

ServletContext对象可以获取应用范围的初始化参数、在应用范围内存取共享数据、访问当前Web应用的信息、访问当前容器的信息和输出日志、访问服务器端的文件系统资源。

只要是在一个项目中,无论用哪种方式获得的ServletContext对象都是同一个。

HttpServletRequest接口

该接口继承了ServletRequest接口,是专用于HTTP协议的子接口,用于封装HTTP请求信息。
HttpServletRequest对象主要用于获取请求报文信息、获取网络连接信息、存取请求域属性。
HttpServletResponse接口继承自ServletResponse,是专用于HTTP协议的子接口,用于封装HTTP响应消息。

HttpServletResponse接口:

该接口主要用于创建响应报文。

注意:

ServletContex接口、HttpServletRequest接口具有相同的存取域属性的方法。

HttpServletRequest接口提供了统一的获取GET请求参数和POST请求参数的方法。


HttpServlet抽象类

HttpServlet抽象类是继承于GenericServlet抽象类而来的。

使用HttpServlet抽象类时,还需要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。

HttpServletRequest接口扩展于javax.servlet.ServletRequest接口,HttpServletResponse接口扩展于javax.servlet.servletResponse接口。

HttpServlet抽象类覆盖了GenericServlet抽象类中的Service( )方法,并且添加了一个自己独有的Service(HttpServletRequest request,HttpServletResponse方法。

通过继承 HttpServlet 实现 Servlet 程序

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。

1、编写一个类去继承 HttpServlet 类

2、根据业务需要重写 doGet 或 doPost 方法

3、到 web.xml 中的配置 Servlet 程序的访问地址

public class HelloServlet2 extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 响应浏览器客户端的post请求
        // 因为两种请求的业务逻辑处理一样;所有通过方法调用,将其串联起来
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 响应浏览器客户端的get请求
        // 服务器进行响应处理
        // 解决中文乱码的问题
        request.setCharacterEncoding("UTF-8");
        // 获取用户端页面发送的表单数据
        // 用户名
        String strAdminName = request.getParameter("adminName");// 参数名要和form表单中的name属性值保持一致
        // 密码
        String strAdminPsw = request.getParameter("adminPsw");
        // TODO 登录业务的逻辑验证处理
        // 输出到控制台
        System.out.println("登录用户名:" + strAdminName + ";密码:" + strAdminPsw);
        // 跳转到业务逻辑处理成功页面
        // 将需要在页面上显示的数据缓存到jsp的四大作用域中;一般常用的是 request和session
        request.getSession().setAttribute("loginedName", strAdminName);  // 缓存到session作用域对象中
        // 转发   logined.jsp页面(转发或重定向 二选一)
        // request.getRequestDispatcher("logined.jsp").forward(request, response);
        // 重定向   logined.jsp页面(转发或重定向 二选一)
        response.sendRedirect("logined.jsp");
    }
}

web.xml 中的配置:

    <!--    Servlet的配置有两部分构成:
    Servlet注册声明;
    Servlet映射配置-->
    <!--进行Servlet配置-Servlet注册声明:向web服务器注册一个Servlet实例对象-->
    <servlet>
        <!--        指明Servlet的名字,具有唯一性-->
        <servlet-name>UserLoginServlet</servlet-name>
        <!--        指明该Servlet的src目录下的后台实现类的包路径名-->
        <servlet-class>com.MXZ.javaweb.control.UserLoginServlet</servlet-class>
    </servlet>
    <!--进行Servlet配置-Servlet映射配置:配置该Servlet在服务器上响应处理那个路径上发送过来的请求-->
    <servlet-mapping>
        <!--        Servlet的名字,该名字一定是在web服务器中进行了注册声明-->
        <servlet-name>UserLoginServlet</servlet-name>
        <!--        Servlet的响应路径;其中 / 表示web服务器的根目录 -->
        <url-pattern>/UserLoginServlet</url-pattern>
    </servlet-mapping>

index.jsp

<form action="UserLoginServlet" method="post">
  <div>用户名:<input type="text" id="txtName" name="adminName"></div>
  <div>密码:<input  type="password"  id="txtPsw" name="adminPsw"></div>
  <input type="submit" value="登录">
</form>
action="UserLoginServlet" method="post">
  <div>用户名:<input type="text" id="txtName" name="adminName"></div>
  <div>密码:<input  type="password"  id="txtPsw" name="adminPsw"></div>
  <input type="submit" value="登录">
</form>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值