java 服务器接口快速开发之servlet详细教程

Servlet简介

servlet是Server Applet的简称,翻译过来就是服务程序.好吧,这么说你可能还是不太懂,简单的讲,这个servlet是运行在服务器上的一个小程序,用来处理服务器请求的.进一步讲,我们知道,一般的网页程序,是由我们通过浏览器访问来实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收请求,并对浏览器的请求作出相应的处理.这就是我们熟悉的B/S模型(浏览器-服务器模型).而servlet就是对请求作出处理的组件,运行于支持Java的应用服务器中.

Servlet的作用

在servlet刚刚出现的那个年代,servlet的作用十分复杂,既承担着处理数据的作用,又承担着展示页面的作用,美工人员想要参与开发,基本上是不太现实的,毕竟美工不可能再去花时间将页面做好.随着时间的推移,出现了MVC思想,也就是模型-界面-控制器思想,极大的简便了开发,也明确了servlet的作用.

根据上面这张图,我们就能知道,servlet在其中承担的作用是controller,控制器,起到对数据进行操作的作用.

顺便补充说明一下,最经典的MVC模型就是JSP+JavaBean+Servlet开发的模式.

#Servlet处理的信息是什么?

我一直再讲,servlet是对数据进行处理的一个控制器,那么,你一定很好奇,servlet究竟处理的是什么数据?

这里你要知道,我之前在其他文章也讲过,我们的web应用完全是基于http协议的.http协议有请求报文(request)和响应报文(request),请求报文就是浏览器向服务器发送的数据形成的数据对象,同理,相应报文就是服务器向浏览器发送的数据形成的信息,而http协议有两个重要的方法,一个是POST,一个是GET,这两个方法就是向浏览器发送请求的方法.

你应该知道这两个方法在什么地方使用,没错,就是在前端的表单中使用,比如你登录CSDN的时候,提交的用户名和密码,就是被http协议封装成请求报文的形式发送到服务器的,这样,servlet就能够读取请求报文的内容,并对报文进行处理了.

Servlet的开发流程

狭义上讲,servlet是servlet是java语言实现的一个类,所以我们就要根据这个类进行相应的扩展开发.

开发流程如下:

编写一个java类,继承HttpServlet类重写HttpServlet类的doGet方法和doPost方法配置web.xml文件,或者使用注解对servlet进行配置

开发流程就是这个样子,我们先来看一下最后一个步骤.

#对servlet进行配置

你一定在想,如果我写了好几个servlet,但是前端发送请求的时候,究竟会把请求发送给哪个servlet呢?我在输入某个地址的时候,究竟是由哪个servlet进行响应的呢?

这时候servlet的配置就显得尤为重要.对servlet的配置指定了对前端请求处理究竟是通过哪个servlet.

配置servlet一共有两种方式,一种是使用web.xml文件配置,另外一种就是使用注解配置,下面我们来详解介绍这两种配置方式

  • 使用web.xml文件配置

注意,servlet的配置内容要写在webapp内部

<webapp>
<!-- 配置一个servlet -->
  <!-- servlet的配置 -->
  <servlet>
  	<!-- servlet的内部名称,自定义。尽量有意义 -->
  	<servlet-name>MyServlet</servlet-name>
  	<!-- servlet的类全名: 包名+简单类名 -->
  	<servlet-class>cn.roobtyan.servlet.FirstServlet</servlet-class>
  </servlet>
  <!-- servlet的映射配置 -->
  <servlet-mapping>
  	<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
  	<servlet-name>MyServlet</servlet-name>
  	<!-- servlet的映射路径(访问servlet的名称) -->
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>
</webapp>

当你访问/first的时候,服务器自然就会把请求交给MyServlet进行处理了.

  • 使用@注解配置

新版本的servlet支持使用注解进行配置,这样极大的简便了开发.

注解配置如下:

@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {
}

然后,你在访问/login的时候,服务器同样就会将处理交由LoginServlet进行处理了.

这样是不是非常爽?(-)

实际上,注解的作用和web.xml的作用是相同的,一般都是推荐使用注解的方式进行开发,这样十分简便,可读性也变的更加强大.

你一定会好奇,如下:

<url-pattern>/first<url-pattern>

@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})

这里面的url可不可以不这么精确的配置,用一种模糊匹配的方式,就是我访问某种规则的路径的时候,统一调用一个servlet,这当然是可以的了.

这就涉及到映射路径的问题了

Servlet映射路径的配置问题

  • 精确匹配

精确匹配就是我们上面用的那种方式,使用固定的url来访问这个servlet,这种没什么需要说明的模糊匹配

  • 模糊匹配

就是比较有意思的了,通过模糊匹配,我们可以让好多路径映射到同一个servlet,模糊匹配一般有如下格式

/*				任意路径都映射到这个servlet
/roobtyan/*		/roobtyan下的任意路径映射到该servlet
*.(*.do  *.action *.html)	是这样的:/任意路径.do/action/html

这里面有两点是需要注意的,一是url要么以/开头,要么以*开头,其他的都是非法的

Servlet的生命周期

一般来讲,servlet只会初始化一次,也就是整个过程中只存在一个servlet对象,即便是有多次访问,依然只有一个对象,这个对象是可以复用的.我想你一定会好奇这个servlet究竟是在什么时候创建的,所以就来讲一下servlet的生命周期,所谓的生命周期我们在java基础知识中一定也了解过,就是servlet类究竟在什么时候创建,调用了何种方法,最后在什么时候被销毁.我们之前学过的对象都是自己手动创建,最后由JVM来销毁的,而servlet的整个生命周期,都是由tomacat,也就是服务器控制的

我们以一张图来了解一下:

可以看到,servlet共有三个关键的方法,分别是init(),service(),destroy().

  • init方法只会调用一次,只是在创建servlet实例的时候才会创建
  • service方法,是进行数据处理的,只要接受了一次请求,就会被调用一次
  • destroy方法,销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象,同样也是调用一次

#一个简单的例子

好了,讲了这么多,你一定是跃跃欲试了,我们就用一个登录控制的例子来简单的看一下servlet开发的步骤.

  • 使用ide新建一个web项目
  • 创建一个前端登录表单login.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>roobtyan登录控制系统</title>
    </head>
    <body>
        <h1 align="center" style="color: red;">欢迎您登录系统后台</h1><hr/>
        <%--the form start--%>
        <div align="center">
            <form method="post" action="/login">
                Username:<input type="text" name="username"/><br/><br/>
                Password:<input type="password" name="password"/><br/><br/>
                <input type="submit" value="登录"/>
            </form>
        </div>
    </body>
    </html>
    

  • 创建一个登录成功页面

同样使用jsp页面

welcome.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>欢迎页面</title>
    </head>
    <body>
        <h1 align="center" style="color: red">Welcome:</h1>
        <%
            out.println(session.getAttribute("user"));
        %>
        <hr/>
        <span style="align:center; color:yellow">
            Time:<%
                out.println(new Date());
            %>
        </span>
    </body>
    </html>
    

  • 创建LoginServlet.java
    public class LoginServlet extends HttpServlet {
    	public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    		//设置字符编码
    		request.setCharacterEncoding("utf8");
    		//从request对象中获取username,password
    		String username = request.getParameter("username");
    		String password = request.getParameter("password");
    		//判断是否为管理员
    		if("administrator".equals(username)&&"123456".equals(password)){
    			//登录成功,设置session
    			HttpSession session = request.getSession(true);
    			session.setAttribute("user", "管理员,欢迎你!");
    		}else {
    			session.setAttribute("user","登录信息错误,请检查用户名或密码");
    		}
    		//将页面转发到欢迎页面
    		requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
            requestDispatcher.forward(request,response);
    	}
    }
    

  • 配置servlet

这里对于servlet的配置,我们采取web.xml的方式,主要是因为这种方法相对麻烦,为了让你有着更好的理解,就这样做了.

<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.roobtyan.cn.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
</servlet-mapping>

这样,我们的第一个servlet程序就做完了.我想如果你存在疑问的话,应该是在jsp技术上,如果是这样,那么请参照我的博客:Jsp技术介绍

还有一个地方你可能存在疑惑,为什么使用request.getParameter方法可以获取到提交的表单中的内容呢?这个很好解释,因为前端使用post或者get方法将表单信息提交到servlet的时候,将表单信息封装成了request对象,这样就可以获取到了.值得注意的是,表单中的name字段,就是我们获取值的根据.

最后一个可能存在疑问位置就是这里

//将页面转发到欢迎页面
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
requestDispatcher.forward(request,response);

这段代码我在最后会解释,其实也挺简单的上面的你都注意到了,那你非常厉害了.不过,有一个地方你可能注意不到,那就是这段代码:

request.setCharacterEncoding("utf8");

设置字符编码的这部分,如果不设置,会造成乱码,这还是需要注意的.关于POST和GET乱码的解决,请看我的文章:POST和GET乱码的解决

#Servlet自动加载

前面我们说了,servlet只有在第一次被访问的时候才会加载,这肯定会造成第一个访问的人访问时间较长,因为他需要等待servlet完成加载.那么,有没有什么方法能够使得servlet自动加载呢,就是在启动服务器的时候就将servlet加载起来呢?答案是有的,同样可以在web.xml中进行配置

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.roobtyan.LoginServlet</servlet-class>
    <!-- 让servlet对象自动加载 -->
    <load-on-startup>1</load-on-startup>
  </servlet>

就是使用的<login-on-startup></login-on-startup>配置的,注意: 其中的整数值越大,创建优先级越低!

Servlet多线程问题

前面我们讲了,一个servlet在服务器中只会存在一个实例,不论是有多少访问,都掉用的同一个实例,也就是单实例多线程的.这就存在着一定的线程安全问题,比如说,我在servlet中定义了一个全局变量,那么这个变量的值很有可能不是我期待的值,所以,在servlet中要尽量避免使用全局变量.

Servlet中重要的对象

在servlet中共有四个重要的对象:

HttpServletRequest  请求对象:获取请求信息
HttpServletResponse 响应对象: 设置响应对象
ServletConfig对象    servlet配置对象
ServletContext对象  servlet的上下文对象

前两个我们介绍的不少,这两个的具体内容我回单独拿出来一章介绍,和HTTP协议一块介绍,我觉得这样看起来更能接受一些.那么我们现在就介绍后面两个

ServletConfig对象

  • 创建时间:在创建完servlet对象的时候,接着创建servletConfig对象.
  • 如何得到对象:直接使用ServletConfig config = this.getServletConfig();
  • 简单使用

这是web.xml的配置文件

 <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.roobtyan.LoginServlet</servlet-class>
    <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
    <init-param>
    	<param-name>location</param-name>
    	<param-value>doom</param-value>
    </init-param>
  </servlet>

配置文件中的init-param就是配置信息

这个ServletConfig对象共有如下的方法

java.lang.String getInitParameter(java.lang.String name)  根据参数名获取参数值
java.util.Enumeration getInitParameterNames()    		 获取所有参数
ServletContext getServletContext()     					 得到servlet上下文对象
java.lang.String getServletName()       				 得到servlet的名称

这个对象比较简单,就不过多介绍,注意,这个对象只能在自己的servlet中使用,超出了范围就不行了.

ServletContext对象

  • 创建时间:加载web应用时创建ServletContext对象
  • 得到对象:从ServletConfig对象的getServletContext方法得到

这个对象又几个比较重要的方法,我们来介绍一下.

  • 作用:在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等
java.lang.String getContextPath()   --得到当前web应用的路径
java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)
java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path)

具体的方法使用就是这样,按照API去用就可以了,我就不再过多介绍

转发

转发

刚才我们用到的

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
requestDispatcher.forward(request,response);

这个就是转发,按照这样用就可以了

重定向

与转发功能相似的是重定向,重定向的使用是这样的:

response.sendRedirect("/welcome.jsp");

这样也会访问到welcome.jsp这个页面.这就是之前的Respose对象,咱们先这样用着,后面我回单独写一章博客来讲解的.

##转发和重定向的区别虽然二者最终实现的功能是相同的.但是还是有很大不同的.不同之处如下

  • 地址栏变化

转发不会改变地址栏中的URL,而重定向则会改变

  • 跳转范围

转发只能访问到当前web应用中的内容,而重定向则可以访问到任意web应用中的内容

  • request对象作用范围

转发后,在转发后的页面中仍然可以使用原来的request对象,而重定向,原来的request对象则失去作用.

所以,如果想要在多个页面使用相同的request对象,那么只能使用转发,而不能使用重定向.好了,以上就是全部要介绍的内容.servlet的生命周期是十分重要的,其他的只能靠动手实践才能很好的掌握,自己动动手敲出一个个好玩的例子吧!

总结

感谢您的阅读,本篇文章就到这里了,希望您能够习惯,也希望您可以多多关注我们的更多内容!

(0)

相关推荐

  • myeclipse开发servlet_动力节点Java学院整理

    在web.xml中可以对同一个Servlet配置多个对外访问路径,并如果在web.xml中配置的信息服务器会自动加载部署,而如果是在Servlet中进行程序代码的修改,则每次都要重新部署. 首先,在使用MyEclipse创建Servlet后,会根据所创建的Servlet进行到web.xml文件的映射,如下图所示: 经过这个映射之后,在web.xml文件中就自动生成了这个Servlet的配置信息: 当然,我们可以在web.xml文件中把这个Servlet继续添加一条对外访问路径,使得这个Servl

  • Servlet开发JavaWeb工程示例详解

    一.什么是Servlet? Servlet是在服务器上运行的小程序,也就是一个Java类,但比较特殊,不需要new,自动就可以运行.也有创建.垃圾回收和销毁过程.Servlet是JavaWeb的三大组件之一(Servlet.Filter.Listener),它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: 接收请求数据: 处理请求: 完成响应. 例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完

  • Javaweb开发中通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.response.study; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; i

  • java web开发之servlet图形验证码功能的实现

    一 验证码的由来 在web项目开发中,为了防止部分人使用自动工具(如:自动注册机)等进行批量的数据处理,在不同的功能节点部分,添加了验证码进行验证,达到对自动软件的屏蔽效果 最经典的应用如:网站注册图形验证码:接下来,通过java技术,结合servlet实现一个网站注册需要的图形验证码程序,提供大家参考. 二 实现注册页面图形验证码效果 1. 创建web项目:java_servlet_verifyimg 2. 创建自动生成图形验证码的控制器--VerifyImgServlet package c

  • javaweb Servlet开发总结(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: <servlet> <servlet-name>ServletConfigDemo1</servlet-name> <servlet-class>gacl.servlet.study.ServletConfigDemo1</servl

  • java 服务器接口快速开发之servlet详细教程

    Servlet简介 servlet是Server Applet的简称,翻译过来就是服务程序.好吧,这么说你可能还是不太懂,简单的讲,这个servlet是运行在服务器上的一个小程序,用来处理服务器请求的.进一步讲,我们知道,一般的网页程序,是由我们通过浏览器访问来实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收请求,并对浏览器的请求作出相应的处理.这就是我们熟悉的B/S模型(浏览器-服务器模型).而servlet就是对请求作出处理的组件,运行于支持Java的应用服务器中. Servlet

  • JSP 开发之Servlet解决网页缓存问题

    JSP 开发之Servlet解决网页缓存问题 (1)我们为什么要防止游览器页面缓存的问题: 所以在不需要缓存的页面中需要实现不缓存页面: 代码如下: package com.lc.HttpTest; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.ser

  • JSP 开发之servlet中调用注入spring管理的dao

    JSP 开发之servlet中调用注入spring管理的dao 我们用spring的依赖注入可以将dao注入到action中,然后我们就可以直接调用了dao中的方法了,可是servlet不是由spring容器管理,所以在servlet中不能注入dao类,也就不能用dao中的方法. 下面是实现方法: private UserDao userDao; public void init() throws ServletException { super.init(); ServletContext s

  • 在Win10上安装Tomcat服务器及配置环境变量的详细教程(图文)

    Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.本文主要讲述Windows环境Tomcat服务器安装与环境变量配置 下载安装JDK 要想安装Tomcat服务器,首先要安装配置好JDK,可以参考JDK安装与环境变量配置 Windows + R然后输入cmd进入命令行窗口,检查Java是否安装正确,检查的命令为java -version 如果输出类似下面的内容说明安装成功

  • Centos8.2云服务器环境安装Tomcat8.5的详细教程

    在安装Tomcat之前,先安装好JDK环境 可以看下我以前写的安装JDK的文章及环境配置 关于Linux服务器配置java环境遇到的问题 去Apache官网下载Tomcat8.5的安装包,https://tomcat.apache.org/ 也可以选择其他版本的 Tomcat 这里选择 Tomcat8,https://tomcat.apache.org/download-80.cgi wget 命令+复制的下载地址 wget https://mirrors.bfsu.edu.cn/apache/

  • Android音视频开发之MediaPlayer使用教程

    目录 MediaPlayer 简单使用 缺陷 AndroidMediaPlayer播放器封装 状态机编写 内部类 初始化函数 方法和回调 小结 MediaPlayer Android多媒体框架支持播放提供了MediaPlayerAPI,可以通过MediaPlayer来实现媒体文件播放.可以说MediaPlayer是非常方便使用的多媒体播放器,只需要简单设置就能实现对音频和视频播放功能,其内部帮助开发者实现了播放对象获取解码以及播放功能. 简单使用 MediaPlayer支持多种资源形式:本地资源

  • Android音视频开发之MediaExtactor使用教程

    目录 前言 MediaExtactor 使用MediaExtactor 加载音视频文件代码 获取轨道代码 提取轨道数据信息 一些源码细节分析 前言 在之前学习如何使用MediaPlayer后,了解到Android系统提供开发者播放多媒体全家桶能力,但对于开发者希望DIY自由度更高的播放器能力也是可以利用Android内部提供组件包自行实现一个播放器的.举例实现一个视频播放这个流程,它大致流程是[多媒体文件解析提取视频文件]-> [视频流解码]-> [解码数据播放渲染到Render].首要需要实

  • springboot快速集成mybatis-plus的详细教程

    简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生.这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网.那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA. springBoot快速集成mybatis-plus 一.pom文件引入mybatis-plus依赖 <dependenc

  • Java的idea连接mongodb数据库的详细教程

    最近有一个java实验,要求用java使用数据库,于是本人新手小白,在idea上卡了好半天 希望看到这个博客的人能解决问题,跳过一些坑 首先,我这里用的是 mongodb 数据库(ps:node.js下mongo太好用了,就没有mysql) 1,用idea创建一个maven工程 由于不牵扯太多功能,直接 next 就行了, 很无奈,创建完就直接报错了 找不到 maven 相关的插件 Cannot resolve plugin org.apache.maven.plugins:maven-comp

随机推荐