Web阶段:第八章:Servlet上

简介: Web阶段:第八章:Servlet上

Servlet技术

a)什么是Servlet

1、Servlet是一个接口(JavaEE规范)

2、Servlet是运行在服务器(Tomcat或其他的服务器)上的小程序。

3、Servlet程序用来接收用户的请求,和给客户端响应数据。(接收请求,回传响应)

b)手动实现Servlet程序

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

2、实现接口中的service方法

3、到web.xml中去配置访问地址

Servlet程序

public class HelloServlet implements Servlet {
  @Override
  public void service(ServletRequest arg0, ServletResponse arg1)
      throws ServletException, IOException {
    System.out.println("hello world!!");
  }
}

web.xml中的配置:

   <!-- 
    servlet配置一个Servlet程序,给Tomcat服务器配置
    -->
    <servlet>
      <!-- servlet-name给这个servlet启一个名称,一般值是类名 -->
    <servlet-name>HelloServlet</servlet-name>
    <!-- servlet-name是Servlet程序的全类名 -->
      <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
    </servlet> 
    <!-- servlet-mapping用来配置servlet程序的访问地址 -->
    <servlet-mapping>
      <!-- servlet-name表示给谁配置访问地址 -->
    <servlet-name>HelloServlet</servlet-name>
 <!-- 
url-pattern配置访问地址
地址的格式:http://ip:port/工程名/资源名    
在服务器上。/ 斜杠 == 表示地址:http://ip:port/工程名/    
/hello ====== 表示http://ip:port/工程名/hello    
也就是说,我们在浏览器地址栏上输入访问地址:
http://ip:port/工程名/hello 就可以访问这个HelloServlet程序。
如果将项目部署到服务器上默认访问的是index.html,如果没有index文件则会报错
--> 
      <url-pattern>/hello</url-pattern>
    </servlet-mapping>

常见错误: servlet-name标签配置不统一

常见错误二:servlet-class标签全类名标签错误

常见错误三:url-pattern没有以斜杠打头

c)解析url到servlet访问细节

d)Servlet的生命周期(了解内容,面试)

1 先执行Servlet的构造器

2 执行init初始化方法

工程启动之后,我们第一次访问Servlet程序的时候执行 1 和 2两个步骤

3 执行service 业务方法

每次调用都会执行service方法

4 执行destroy销毁方法

当web工程停止的时候(重新部署)

e)模拟GET请求和POST请求的分发

public class HelloServlet implements Servlet {
  /**
   * service方法是业务处理方法,每次请求都会调用
   */
  @Override
  public void service(ServletRequest request, ServletResponse response)
      throws ServletException, IOException {
//    System.out.println("3 service业务处理方法");
    // 想办法知道到底请求进来到底是GET。还是POST
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    //getMethod 可以获取请求的方式,GET或POST
    String method = httpRequest.getMethod();
    // System.out.println( method );
    // 可能一般GET请求,和POST请求,需要做的工作不同
    if ("GET".equals(method)) {
      // 做GET请求的处理
      doGet();
    } else if ("POST".equals(method)) {
      // 做POST请求的处理
      doPost();
    }
  }
  public void doGet() {
    System.out.println("这是GET请求的功能");
  }
  public void doPost() {
    System.out.println("这是POST请求的功能");
  }
}

f)通过继承HttpServlet实现Servlet程序

在开发的时候。为了让开发代码更佳简洁,方便,然后规范中提供了一个类叫HttpServlet类。

我们只需要继承HttpServlet类,就可以实现Servlet程序了

1、编写一个类去继承HttpServlet

2、重写doGet或doPost方法

3、去web.xml中去配置请求地址

源代码:

public class HelloServlet2 extends HttpServlet {
  /**
   * doGet方法,在请求进来 是GET请求的时候,调用
   */
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    System.out.println("这是继承HttpServlet 实现的 GET功能");
  }
  /**
   * doPost方法,在请求进来 是POST请求的时候,调用
   */
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    System.out.println("这是继承HttpServlet 实现的 POST功能");
  }   
}

web.xml中的配置:

<servlet>
    <servlet-name>HelloServlet2</servlet-name>
    <servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet2</servlet-name>
    <!-- 在服务器中 / 斜杠 ===== 表示http://ip:port/工程名/
      /hello2 ===>>>> http://ip:port/工程名/hello2
     -->
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>

表单:

<form action="http://localhost:8080/day06/hello2" method="post">
        <input type="submit" />
</form>

g)使用Eclipse创建Servlet程序

Servlet类的继承体系

ServletConfig类

ServletConfig类从类名中就感觉它是Servlet程序的配置信息。

这个ServletConfig只能由Tomcat服务器负责创建。每次Tomcat创建Servlet程序的时候,就会创建ServletConfig对象,然后调用init初始化方法进行初始化操作。

a)ServletConfig类的三大作用

1、获取在web.xml中配置的Servlet-name的别名

2、获取在web.xml中配置的初始化参数init-param

3、获取ServletContext对象

源代码:

public class ConfigServlet extends HttpServlet {
  public void init(ServletConfig config) throws ServletException {
//    1、获取在web.xml中配置的Servlet-name的别名
    System.out.println("servlet-name的值:" + config.getServletName());
//    2、获取在web.xml中配置的初始化参数init-param
    System.out.println("初始化参数user的值:" + config.getInitParameter("user"));
    System.out.println("初始化参数url的值:" + config.getInitParameter("url"));
//    3、获取ServletContext对象
    System.out.println( config.getServletContext() );
  }
}

web.xml中的配置:

<servlet>
    <servlet-name>ConfigServlet</servlet-name>
    <servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
    <!-- 
      init-param
        配置配置初始化参数(由键值对组成)
     -->
    <init-param>
      <!-- param-name是参数名 -->
      <param-name>user</param-name>
      <!-- param-value是参数值 -->
      <param-value>root</param-value>
    </init-param>
    <!-- 
      init-param
        配置配置初始化参数(由键值对组成)
     -->
    <init-param>
      <!-- param-name是参数名 -->
      <param-name>url</param-name>
      <!-- param-value是参数值 -->
      <param-value>jdbc:mysql://localhost:3306/test</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>ConfigServlet</servlet-name>
    <url-pattern>/configServlet</url-pattern>
  </servlet-mapping>

注意点:

ServletContext类

a)什么是ServletContext?

1、ServletContext是一个接口

2、ServletContext在一个web工程中只有一个对象实例(Tomcat服务器负责创建)。

3、ServletContext是一个域对象。

什么是域对象?

域对象是可以像map一样存取数据的对象

setAttribute 保存数据 put

getAttribute 获取数据 get

removeAttribute 删除数据 remove

域指的是这些存取的数据的操作范围。ServletContext对象的数据操作范围是整个web工程。

ServletContext对象在web工程启动的时候创建。在web工程停止的时候销毁。

b)ServletContext类的四个作用

1、获取在web.xml中配置的上下文初始化参数 context-param

2、获取工程路径地址

3、获取工程发布之后在服务器上的绝对路径

4、像map一样存取数据。

ServletContext作用的演示源代码:

public class ContextServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
    //获取ServletContext对象
    ServletContext servletContext = getServletContext();    
//    1、获取在web.xml中配置的上下文初始化参数  context-param
    String password = servletContext.getInitParameter("password");
    String url = servletContext.getInitParameter("url");
    System.out.println( "上下文参数password的值:" + password );
    System.out.println( "上下文参数url的值:" + url );
//    2、获取工程路径地址
    System.out.println("当前工程路径是:" + servletContext.getContextPath());
//    3、获取工程发布之后在服务器上的绝对路径
    // / 斜杠表示到http://ip:port/工程名/ 映射到代码的webContent目录  
    // getRealPath 获取在服务器上的绝对路径。
    System.out.println( "/ 根 的绝对路径是:" + servletContext.getRealPath("/") );
    System.out.println("/css的绝对路径是:" + servletContext.getRealPath("/css"));
    System.out.println("/imgs/11.jpg的绝对路径是:" + servletContext.getRealPath("/imgs/11.jpg"));
    System.out.println( servletContext.getRealPath("/1.js") );
  }
}

web.xml配置文件内容:

<context-param>
    <param-name>password</param-name>
    <param-value>root</param-value>
  </context-param>
  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/contextServlet</param-value>
  </context-param>

像map一样存取数据:

Context1的代码:

public class Context1 extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {  
    ServletContext context = getServletContext();
    System.out.println( context );
    // 获取属性值:
    System.out.println("在保存属性前 Context1 里获取abc的属性值:" + context.getAttribute("abc"));    
    context.setAttribute("abc", "麦当劳是谁开的?麦当娜开的!因为他们都姓麦!");  
    System.out.println("在保存属性后 Context1 里获取abc的属性值:" + context.getAttribute("abc"));
  } 
}

Context2的代码:

public class Context2 extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {    
    ServletContext context = getServletContext();
    System.out.println( context );
    // 获取属性值:
    System.out.println("Context2 里获取abc的属性值:" + context.getAttribute("abc"));
  }
}
相关文章
|
2月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
25 1
|
2月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
18 0
|
2月前
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
30 0
|
4月前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
87 12
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
84 10
|
4月前
|
缓存 负载均衡 安全
Servlet与JSP在Java Web应用中的性能调优策略
【6月更文挑战第23天】在Java Web中,Servlet和JSP调优至关重要,以应对高并发和复杂业务带来的性能挑战。优化包括Servlet复用、线程安全、数据库连接池,以及JSP的编译优化、使用JSTL、页面缓存和静态内容分离。全局优化涉及负载均衡、异步处理和缓存策略。通过这些实践,开发者能提升应用响应速度和吞吐量,确保高负载下的稳定运行。
60 7
|
4月前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
50 7
|
5月前
|
存储 缓存 前端开发
14:Servlet中的页面跳转-Java Web
14:Servlet中的页面跳转-Java Web
135 6
|
5月前
|
缓存 前端开发 Java
15:Servlet 3.0文件上传与下载-Java Web
15:Servlet 3.0文件上传与下载-Java Web
137 5
|
5月前
|
SQL Java 数据库连接
17:数据库连接池与Servlet整合-Java Web
17:数据库连接池与Servlet整合-Java Web
103 3
下一篇
无影云桌面