纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

Roobtyan   2021-06-24 我要评论
想了解java 服务器接口快速开发之servlet详细教程的相关内容吗Roobtyan在本文为您仔细讲解servlet详细教程的相关知识和一些Code实例欢迎阅读和指正我们先划重点:java开发,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的生命周期是十分重要的其他的只能靠动手实践才能很好的掌握自己动动手敲出一个个好玩的例子吧!

总结

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


相关文章

猜您喜欢

网友评论

Copyright 2020 www.gamerfx.net 【游戏天空】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式