Servlet学习

Servlet学习

1、Tomcat

tomcat是一个web服务器,用来处理web请求

  • 下载 tomcat 安装包

  • 解压安装包

  • 进行配置 :配置文件 server.xml, 文件路径如: D:\tomcat\conf\server.xml

    • 将配置文件端口改为80,因为通过web访问,80端口可以不写,默认为80端口
    <Connector port="8080" protocol="HTTP/1.1"             connectionTimeout="20000" redirectPort="8543" />
    
  • 启动tomcat服务

    • 启动路径如:D:\tomcat\bin\startup.bat
  • 测试tomcat

    • 修改tomcat 配置文件 server.xml,增加测试 html文件路径配置,路径指向为 html文件页面文件夹

      <Context path="/" docBase="D:\\work\\test\\j2ee1\\web" debug="0" reloadable="false" />
      
  • 重启tomcat 服务

  • 浏览器输入 : http://127.0.0.1/hello,请求能够正常显示表示配置成功

2、Servlet

2.1-Servlet介绍

Servlet本身不能独立运行,需要在 web 应用中运行,现在我们是把web应用部署在tomcat中的

2.2-创建一个Servlet的步骤
  • 创建 web 应用项目

    • 创建java项目
    • 导入 servlet-api.jar
  • 编写 servlet 代码

    • 创建 Servlet 类,注意:在集成开发工具eclipse创建Class时,让包名置空

      • 普通类继承 HttpServlet

      • 创建 servlet 类和 url之间的映射关系(两种方式)

        • 在 Servlet 类中使用注解

          //name 表示 servlet的名字
          // loadOnStartup 表示 加载的顺序 ,范围 1~99,数值越小,加载优先级越高
          //urlPatterns 表示访问的 url
          @WebServlet(name="change",loadOnStartup=1,urlPatterns={"/change.do"})
          
          //简化方式
          @WebServlet("/change.do")
          
        • 使用 web.xml 文件配置

              <servlet>
                  <!--servlet 文件名-->
                  <servlet-name>LoginServlet</servlet-name>
                  <!--servlet 字节码文件名-->
                  <servlet-class>LoginServlet</servlet-class>
                  <!--servlet 加载优先顺序-->
                  <load-on-startup>10</load-on-startup>
              </servlet>
           
              <servlet-mapping>
                  <!--servlet 文件名-->
                  <servlet-name>LoginServlet</servlet-name>
                  <!--servlet 处理的url路径-->
                  <url-pattern>/login</url-pattern>
              </servlet-mapping> 
          
      • 重写 doGet() 和 doPost()方法

      //servlet类处理 url 请求时,会调用 server 方法,通过server方法,根据html 页面的请求,再决定调用 doGet 还是 doPost 方法
      //可以重写 server 方法接收  get 和 post 两种请求,但是不建议,实际多为重写 doGet 和 doPost
      protected void doGet(HttpServletRequest request,
      			HttpServletResponse response) {	
      	}
      protected void doPost(HttpServletRequest request,
      			HttpServletResponse response) {	
      	}
      
  • 部署到 tomcat 中

    • 在 web项目下创建文件夹, web ->WEB-INF->classes

      文件夹名字不能错

    • 设置项目输出 servlet字节码文件到classes 目录下

      项目右键->properties->Java Build Path->Source->右下角的 Brower-> 指定位置是: 项目名/web/WEB-INF/classes

    • 配置tomcat 中server.xml的 <context>

      <!--
      	根据实际情况配置
      	注意反双斜杠
      	配置完成需要重启tomcat
      -->
      <Context path="/" docBase="e:\\xxx\\web" debug="0" reloadable="false" />
      
2.3-Servlet获取参数
2.3.1-创建参数提交html页面
<!doctype html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>登录页面</title>
	</head>
	<body>
		<form action="login" method = "post">
			账号:<input type = "text" name = "name"><br>
			密码:<input type = "password" name = "password"><br>
			<input type = "submit" value = "登录">
		</form>
	</body>
</html>
2.3.2-创建 处理 页面 action 的 LoginServlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
public class LoginServlet extends HttpServlet {
    
    //由于我们的html页面 请求方式为 post,所以只需要重写 doPost方法
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        String name = request.getParameter("name");
        String password = request.getParameter("password");
  
        System.out.println("name:" + name);
        System.out.println("password:" + password);
    }
}
2.3.3-映射 LoginServlet 到路径 login
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping> 
2.3.4-通过html页面提交数据到表单中
  • 重启 tomcat
  • 访问页面 :http://127.0.0.1/login.html
  • 提交数据,通过tomcat 控制台可以看到
2.4-Servlet返回响应

通过 response 对象,获取PrintWriter对象,再通过 PrintWriter对象调用println方法,输出 html 标签到页面

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 LoginServlet extends HttpServlet {
  
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
        String name = request.getParameter("name");
        String password = request.getParameter("password");
  
        String html = null;
  
        if ("admin".equals(name) && "123".equals(password))
            html = "<div style='color:green'>success</div>";
        else
            html = "<div style='color:red'>fail</div>";
  		
        PrintWriter pw = response.getWriter();
        pw.println(html);
  
    }
  
}
2.5-Servlet调用流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5xw5j7c-1604567124818)(E:\图片\servlet 流程图.png)]

  • login.html

    静态页面,可以通过 form提交数据

  • /login.html

    将数据提交到 /login 路径

  • 找到对应的 Servlet 来进行处理

  • 实例化 Servlet对象

    tomcat定位了 LoginServlet后,发现没有LoginServlet的实例化对象,就会调用LoginServlet的无参构造方法创建一个对象

  • 调用 doGet() 或者 doPost() 方法

    根据页面传的请求方式,调用对应的方法

  • request 获取参数

    获取方法:request.getParameter(String s)

  • response 设置响应

    设置方法:response.getWriter().println(String s)

  • tomcat把html传递给浏览器

2.6-Servlet service()

LoginServlet继承了HttpServlet,同时也继承了一个方法

service(HttpServletRequest , HttpServletResponse )

  • 在执行doGet()或者doPost()之前,都会先执行service()
  • 由service()方法进行判断,到底该调用doGet()还是doPost()
2.7-Servlet 处理中文

由于 tomcat 8以上,get请求没有乱码问题,所以这里只讲 post请求乱码处理

  • 方法一:

    • 接收数据之前,必须对request进行转码操作

      request.setCharacterEncoding("UTF-8");
      

      缺点:当存在大量 servlet 时,每个servlet都需要进行转发和转码,会很麻烦

  • 方法二:

    • 使用过滤器,如何让一个类称为过滤器组件

      • 实现过滤器接口

        javax.servlet.Filter

      • 配置过滤器地址

        //配置为需要过滤的地址
        @WebFilter("/login")
        
      • 实现 doFilter 方法

        doFilter 方法必须进行转发,最后该找谁还是去找谁

        对象名.doFilter(ServletRequest servletRequest,ServletResponse servletResponse)

2.8-Servlet生命周期
  • 加载类

  • 实例化

    调用Servlet 无参构造方法,在内存中创建对象,开辟空间,多次调用Servlet,都只执行一次构造方法,Servlet 是单例设计模式

  • 初始化

    调用初始化方法 init() ,在创建对象的时候执行,整个声明周期,都只会执行一次

  • 提供服务

    service 方法,根据 service 方法 调用 doGet 或者 doPost

  • 销毁

    1、重新启动 web应用,就会调用 destroy()

    2、关闭tomcat 时,destroy() 会被调用

  • 被回收

    Servlet 被销毁之后,就满足垃圾回收的条件,下一次进行垃圾回收就会把该对象回收

2.9-Servlet跳转
  • 在Servlet服务端进行跳转

    request.getRequestDispatcher("html文件").forward(request, response);

    服务端进行跳转,前端的页面路径显示仍然不变,不会变成跳转到的html文件路径

  • 客户端进行跳转

    response.sendRedirect("html文件")

    客户端进行跳转,浏览器的地址会变化

  • 服务端跳转实际是服务端把跳转的页面处理,然后把html内容发送到浏览器,客户端跳转是服务端把跳转的页面路径返回给了客户端,客户端重新发起了请求

2.10-Servlet 自启动

tomcat 启动,有些初始化代码需要执行,但是 Servlet 的执行是被浏览器调用之后才开始的,这时候,就需要Servlet实现 自启动,即随着 tomcat的启动,进行初始化

  • 使用web.xml,在web.xml中,加一行

    <load-on-startup>10</load-on-startup>
    
  • 使用注解映射

    @WebServlet(name="change",loadOnStartup=1,urlPatterns={"/change.do"})
    
2.11-Servlet request常见方法
2.11.1-常见方法
方法名作用
request.getRequestURL()获取浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)
request.getRequestURI()浏览器发出请求的资源名部分,去掉了协议和主机名
request.getQueryString()请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr()浏览器所处于的客户机的IP地址
request.getRemoteHost()浏览器所处于的客户机的主机名
request.getRemotePort()浏览器所处于的客户机使用的网络端口
request.getLocalAddr()服务器的IP地址
request.getLocalName()服务器的主机名
request.getMethod()得到客户机请求方式一般是GET或者POST

2.11.2-获取参数
方法名作用
request.getParameter()是常见的方法,用于获取单值的参数
request.getParameterValues()用于获取具有多值的参数,比如注册时候提交的 “hobits”,可以是多选的。
request.getParameterMap()用于遍历所有的参数,并返回Map类型。
2.11.3-获取头信息
方法名作用
request.getHeader()获取浏览器传递过来的头信息。
request.getHeaderNames()获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息
2.12-Servlet response 用法
  • 设置响应内容

    通过response.getWriter()获取对象,可以使用 println() ,append(),write(),format()等方法设置返回给浏览器的html内容

  • 设置响应格式

    response.setContentType("text/html")

    "text/html"就是格式,在 request 获取头信息对应的 request.getHeader("accept")

    "text/html"存在,表示浏览器可以识别。如果换一个格式浏览器不能识别,就会打开一个下载文件的弹窗

    通常使用该方式实现下载功能

    • 设置响应编码

      都需要在 response 使用前设置才能生效

      方法一:

      response.setContentType("text/html;charset = UTF-8")

      方法二:

      response.setCharacterEncoding("UTF-8")

  • 301和302客户端跳转

    302跳转

    response.sendRedirect("html文件")

    301跳转

    //setHeader方法参数,第一个参数地址,第二个参数 html文件
    response.setStatus(301);
    responde.setHeader("Location","fail.html");
    
  • 设置不使用缓存

    使用缓存可以让页面加载更快,减轻服务器的负担,但是也有可能看到过时信息,可以通过下面方法设置不使用缓存

response.serDateHeader(“Expires”,0);
response.setHeader(“Cache-Control”,“no-cache”);
response.setHeader(“pragma”,“no-cache”);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值