JavaEE学习day-46:Servlet技术(1)

2019-09-28  本文已影响0人  开源oo柒

一、HTTP协议

1.HTTP协议的概念:

超文本传输协议(Hyper Text Transfer Protocol);

  客户端根据用户输入的地址信息请求服务器,服务器在接收到用户的请求后进行处理,然后将处理结果响应给客户端,客户端将响应结果展示给用户;支持B/S及C/S模式。

流程图

请求:客户端根据用户地址信息将数据发送给服务器的过程 。
响应:服务器将请求的处理结果发送给浏览器的过程 。

2.HTTP 的交互流程:

步骤:

HTTP 协议之请求格式:

  • 请求行:请求方式、请求的地址和 HTTP 协议版本 ;
  • 请求头:消息报头,一般用来说明客户端要使用的一些附加信息 ;
  • 空行: 位于请求行和请求数据之间,空行是必须的。
  • 请求数据:非必须的。
实例图
(1)get 请求方式: get示例 (2)post请求方式: post示例
两种方式的区别:

HTTP 协议的响应:

响应格式:

  • 响应行(状态行):HTTP 版本、状态码、状态消息
  • 响应头:消息报头,客户端使用的附加信息
  • 空行:响应头和响应实体之间的,必须的。
  • 响应实体:正文,服务器返回给浏览器的信息
    示例
    HTTP 常见响应状态码:
      HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP 状态码共分为 5 种类型:
分类 常见状态码

3.Tomcat服务器:

  • 基本概念:

  所谓服务器软件其实就是代码编写的一个可以根据用户请求实时的调用执行对应的逻辑代码的一个容器。在普通用户看来就是一个安装程序。我们只需要将服务器在操作系统上进行安装,并将我们事先编写好的逻辑处理代码根据规则放到服务器的指定位置,启动服务器,那么服务器就自动的会根据接收到请求调用并执行对象的逻辑代码进行处理。

软件的下载和安装:
 下载地址:https://tomcat.apache.org/download-70.cgi

下载选项

下载成功后会为压缩包文件,解压即可使用 。
注意:尽量不要解压在中文目录中。

1.tomcat 的运行依赖 JDK,必须配置 JDK 环境。配置方式参照百度。
2.闪退,启动闪退问题一般是因为JDK的环境变量配置有问题,
参照 1 进行重新进行配置,如果还是闪退,在 bin\startup.bat 文件中的第一行前面加入:
 SET JAVA_HOME=JDK 目录
 SET CATALINA_HOME=解压后 Tomcat 的目录
 这样,运行 startup.bat 就可以正常启动 tomcat 服务器,如 果想点击 shutdown.bat 关闭服务器,同样在 shutdown.bat 文 件中加入上面的两行即可 。


二、Servlet技术的引入

1.Servlet 介绍:

狭义的 Servlet 是指 Java 语言实现的一个接口。
广义的 Servlet 是指任何实现了这个 Servlet 接口的类。
一般情况下,人们将 Servlet 理解为后者。Servlet 运行于支持 Java 的应用服务器中。从原理上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器 。

运行在支持 java 的应用服务。
Servlet 的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的 servlet 进行请求处理。
简单方便,可移植性强 。

1.创建普通的 java 类并继承 HttpServlet ;
2.覆写 service 方法 ;
3.在 service 方法中书写逻辑代码即可 ;
5.在 webRoot 下的 WEB-INF 文件夹下的 web.xml文件中配置 servlet。

2.第一个Web程序:

步骤:
(1)打开 Myeclipse 并创建工作空间 ;
(2)点击 file 选择—>new—>web project—>输入项
   目名,点击 finish ;
(3)在 src 下创建包 com.bjsxt.servlet.
(4)在包下创建一个普通 java 类 MyServlet,并继承
HttpServlet 。

package com.bjsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//覆写Service方法
public class MyServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第一个Servlet程序");
        resp.getWriter().write("This is Servlet");;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    <!-- 配置Servlet 
        注意:
            一组Servlet配置包括两个组成部分(Servlet,servlet-mapping),两个组成部分的servlet-name值必须一致。
    -->
        <!-- 配置serlet类路径 -->
        <servlet>
            <servlet-name>my</servlet-name>
            <servlet-class>com.bjsxt.servlet.MyServlet</servlet-class><!-- 书写servlet的全限定路径(包名+类名) -->
        </servlet>
        <!-- 配置访问方式 -->
        <servlet-mapping>
            <servlet-name>my</servlet-name>
            <url-pattern>/my</url-pattern><!-- 配置servlet的访问别名 -->
        </servlet-mapping>

MyEclipse 是开发工具,通过此工具便于程序员的代码编写。
真正运行的代码不是 MyEclipse 中编写的代码,而是 tomcat 服务器中部署好的代码。Tomcat 会根据请求自动调用对应的代码进行请求处理。


3.Myeclipse 集成 Tomcat:

  将 tomcat 的目录和 Myeclipse 集成起来,这样 Myeclipse 在帮
我们复制更改的代码的时候,就知道复制到哪个服务器中。

第一步:选中 window---->preferences ;

第二步:
第三步:

4.Servlet 的 web.xml 配置:

<servlet>
        <servlet-name>my</servlet-name>
        <servlet-class>com.zlw.servlet.Servlet01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>my</servlet-name>
            <!-- 配置方式一 -->
            <url-pattern>/my</url-pattern>
            <!-- 配置方式二 -->
            <url-pattern>*.do</url-pattern>
            <!-- 配置方式三 -->
            <url-pattern>/*</url-pattern>
            <!-- 配置方式四 -->
            <url-pattern>/one/*</url-pattern>
    </servlet-mapping>

一个Servlet可以配置多个url-pattern不同的Servlet不允许配置相同的url-pattern,如果配置了在服务器启动的时候就会报错。服务器启动的时候就会将部署的项目中的web.xml文件加载进内存。

5.Servlet的生命周期:

从第一次被调用到服务器关闭 。

示意图
注意:

  服务器在接收到浏览器的请求后,会开辟一个线程来处理此次请求,在线程中调用对应的Servlet进行处理。
  服务器调用Servlet服务器只会创建一个实例化对象,该对象是线程共享的。

  我们可以在web.xml中配置load-on-startup来设置Servlet的加载时机为服务器启动。生命周期就变为从服务器开启到服务器关闭。

package com.zlw.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LifeServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("LifeServlet.init(我被初始化了)");
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("被执行了!");
    }
    @Override
    public void destroy() {
        System.out.println("LifeServlet.destroy(我被销毁了)");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
   
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>LifeServlet</servlet-name>
    <servlet-class>com.zlw.servlet.LifeServlet</servlet-class>
      <load-on-startup>1</load-on-startup><!-- 配置servlet服务器启动时完成加载和初始化创建 -->
  </servlet>
  <servlet-mapping>
    <servlet-name>LifeServlet</servlet-name>
    <url-pattern>/life</url-pattern>
  </servlet-mapping>
</web-app>
init sevice distroy

6.Service 和 doGet 和 doPost 方法:

Service 方法:
 不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有service 方法,则优先调用 Service 方法。
doGet 方法:
 在没有service 方法的情况下如果是 get 方式的请求所调用的处理请求的方法。
doPost 方法:
 在没有 service 方法的情况下如果是 post 方式的请求所调用的处理请求的方法 。

package com.zlw.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("UserServlet.doGet(我是get方式的请求)");
        response.getWriter().write("This is doGet");
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("UserServlet.doPost(我是post方式的请求)");
        response.getWriter().write("This is doPost");
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("UserServlet.service(我是service 方法)");
        super.service(req, resp);
    }


JSP代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <form action="user" method="post">
        用户名:<input type="text" name="uname" value="" /><br>
        密码:<input type="password" name="pwd" value="" /><br>
        <input type="submit" value="登录" />
    </form>
  </body>
</html>

get请求方式 post请求方式

7.Servlet 的常见错误总结:

原因一:在请求地址中的servlet的别名书写错误 。
原因二:虚拟项目名称拼写错误 。

错误一:ava.lang.ClassNotFoundException:
    com.bjsxt.servlet.ServletMothod;
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二: 因为service方法体的代码执行错误导致 。
解决:根据错误提示对service方法体中的代码进行错误更改。

原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用 service 方法进行请求处理,并且不要再 service 方法中调用父类的 service。

上一篇 下一篇

猜你喜欢

热点阅读