Servlet案例

一、Servlet接口概述

Servlet接口–》通过Servlet接口,提供了一个Servlet所应该具备的所有功能
GenericServlet类—》实现了Servlet接口,并且实现了大部分的方法,但是service方法没有实现
HttpService类–》继承了GenericServlet类,并且实现了service方法,会判断请求方式,根据不同的请求方式,调用不同的doXXX方法。

二、Servlet程序使用案例

1、Servlet程序访问过程

Servlet创建之后会自动生成web.xml里面的servlet配置以及一个java文件。

web.xml文件解释

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--
    浏览器可以书写一个url,访问我们的servlet程序,当url访问servlet时,就可以调用servlet对应doXXX方法,执行对应的逻辑处理。
    浏览器的url:http://localhost:8080/web应用名/具体的servlet定位符

    url解释:
    localhost:8080:tomcat服务器访问地址
    web应用名:web应用发布时的application context的值,一般和项目名相同比较好
    具体的servlet定位符:主要定位使用哪个servlet程序,利用web.xml的8行配置,url-pattern的值就是servlet定位符

    最终的访问路径是:http://localhost:8080/TestServlet1_war_exploded/ServletTest
    /ServletTest的值会跟url-pattern匹配,如果相同则定位到了具体的资源,然后找servlet-mapping中的servlet-name的值,让这个值跟servlet中的
    servlet-name值进行匹配,如果两个值相同,则找相邻的servlet-class的值,这个值就是当前url访问servlet的全路径,就可以通过url调用该servlet程序
    -->
    <servlet>
        <servlet-name>ServletTest</servlet-name>
        <servlet-class>com.weq.ServletTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletTest</servlet-name>
        <url-pattern>/ServletTest</url-pattern>
    </servlet-mapping>
</web-app>

运行结果:

在这里插入图片描述
且浏览器能正常访问http://localhost:8080/TestServlet1_war_exploded/ServletTest
在这里插入图片描述

2、通过创建html测试Servlet程序

在web目录创建html文件,文件代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试servlet的get和post</title>
</head>
<body>
<h1>GET方式</h1>
<form action="http://localhost:8080/TestServlet1_war_exploded/ServletTest" method="get">
    <input type="submit">
</form>
<h1>POST方式</h1>
<form action="http://localhost:8080/TestServlet1_war_exploded/ServletTest" method="post">
    <input type="submit">
</form>
</body>
</html>

修改ServletTest.java文件,添加输出的内容,代码如下:

package com.weq;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("调用了doPost方法");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("调用了doGet方法");
    }
}

重新deploy访问测试,测试结果如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以看到调用到了后端的doGet和doPost方法

三、Request

1、概述

Request对象用来解析请求参数,当浏览器访问服务器时,携带着一些请求参数,可以通过Servlet提供的Request对象提供的API来解析请求参数
请求对象有两个:
ServletRequest
httpServletRequest

2、常用的方法:

getParameter("参数名")--根据参数名获取参数的值
getParameterValues()--获取到所有参数的值并存入数组
setCharacterEncoding()--设置请求的字符编码方式
getCharacterEncoding()--返回字符编码方式
setAttribute(String,Object)	存储此请求中的属性
getAttribute(String name)	返回指定属性的属性值

3、测试

新建sevlet程序
在这里插入图片描述

web.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--
    浏览器可以书写一个url,访问我们的servlet程序,当url访问servlet时,就可以调用servlet对应doXXX方法,执行对应的逻辑处理。
    浏览器的url:http://localhost:8080/web应用名/具体的servlet定位符

    url解释:
    localhost:8080:tomcat服务器访问地址
    web应用名:web应用发布时的application context的值,一般和项目名相同比较好
    具体的servlet定位符:主要定位使用哪个servlet程序,利用web.xml的8行配置,url-pattern的值就是servlet定位符

    最终的访问路径是:http://localhost:8080/TestServlet1_war_exploded/ServletTest
    /ServletTest的值会跟url-pattern匹配,如果相同则定位到了具体的资源,然后找servlet-mapping中的servlet-name的值,让这个值跟servlet中的
    servlet-name值进行匹配,如果两个值相同,则找相邻的servlet-class的值,这个值就是当前url访问servlet的全路径,就可以通过url调用该servlet程序
    -->
    <servlet>
        <servlet-name>ServletTest</servlet-name>
        <servlet-class>com.weq.ServletTest</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ServletTest</servlet-name>
        <url-pattern>/ServletTest</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>requestTest</servlet-name>
        <servlet-class>com.weq.requestTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>requestTest</servlet-name>
        <url-pattern>/requestTest</url-pattern>
    </servlet-mapping>
</web-app>

requestTest.java代码如下:

package com.weq;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class requestTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("===========获取请求行信息===========");
        String method = request.getMethod();
        System.out.println("请求方式是:"+method);
        String requestURI = request.getRequestURI();
        System.out.println("请求url是:"+requestURI);
        String protocol = request.getProtocol();
        System.out.println("请求协议是:"+protocol);

        System.out.println("===========获取请求头信息===========");
        System.out.println("请求HOST是:"+request.getHeader("Host"));
        System.out.println("请求Sec-Ch-Ua是:"+request.getHeader("Sec-Ch-Ua"));
    }
}

运行结果:
在这里插入图片描述

请求转发概述

请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源时,该资源将请求转交给另外一个资源进行处理的过程,就叫做请求转发,具有以下特点:
1,请求转发整个过程是一次请求、一次响应
2,请求转发前后,浏览器地址栏地址不会发生变化(浏览器–访问–>A–转发–>B,地址栏地址始终指向A的地址)
3,请求转发前后的request对象是同一个
4,转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发
5,使用代码: request.getRequestDispatcher(访问目的资源的路径).forward(request,response);
6,也可以使用 setAttribute()/getAttribute()来验证

在这里插入图片描述

请求转发测试

创建一个名为requestTest1的servlet,再创建一个html,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>借钱案例</title>
</head>
<body>
<form action="http://localhost:8080/TestServlet1_war_exploded/requestTest1">
    小明向小刚借钱:<input type="text" name="money">
    <input type="submit">
</form>
</body>
</html>

requestTest1.java代码如下:

package com.weq;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class requestTest1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Integer qian=1000;
        response.setContentType("text/html;charset=utf-8");
        String money = request.getParameter("money");
        System.out.println("小明向小刚借了:" + money + "元");
        PrintWriter writer = response.getWriter();
        if (Integer.parseInt(money)<qian) {
            writer.write("小明向小刚借了:" + money + "元");
        }else {
            System.out.println("没钱了,借不了");
            request.setAttribute("money",money);
            request.getRequestDispatcher("/requestTest2").forward(request,response);
        }

    }
}

再创建一个servlet,代码如下:

package com.weq;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class requestTest2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/htlm;charset=utf-8");
        String money = request.getParameter("money");
        PrintWriter writer = response.getWriter();
        writer.write("小明向小红借了" + money+"元");
    }
}

代码运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、response

1、概述

Response是代表Http响应信息的对象,其中将会封装服务器要发送给浏览器的响应信息,将response对象作为参数传递给service方法,在service方法处理请求的过程中,可以将要发送给浏览器的数据,先写入response对象中,在service方法执行完后,服务器负责从response对象中获取到响应信息,再按照http响应信息的格式组织成响应消息,发送给浏览器。

2、常用的方法:

setContentType(“参数名”)–设置响应的字符编码方式
sendRedirect()–完成重定向
getOutputStream()–获取字节输出流
getWriter()–获取字符输出流

3、测试

创建一个名为reponseTest的servlet
web.xml的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--
    浏览器可以书写一个url,访问我们的servlet程序,当url访问servlet时,就可以调用servlet对应doXXX方法,执行对应的逻辑处理。
    浏览器的url:http://localhost:8080/web应用名/具体的servlet定位符

    url解释:
    localhost:8080:tomcat服务器访问地址
    web应用名:web应用发布时的application context的值,一般和项目名相同比较好
    具体的servlet定位符:主要定位使用哪个servlet程序,利用web.xml的8行配置,url-pattern的值就是servlet定位符

    最终的访问路径是:http://localhost:8080/TestServlet1_war_exploded/ServletTest
    /ServletTest的值会跟url-pattern匹配,如果相同则定位到了具体的资源,然后找servlet-mapping中的servlet-name的值,让这个值跟servlet中的
    servlet-name值进行匹配,如果两个值相同,则找相邻的servlet-class的值,这个值就是当前url访问servlet的全路径,就可以通过url调用该servlet程序
    -->
    <servlet>
        <servlet-name>ServletTest</servlet-name>
        <servlet-class>com.weq.ServletTest</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ServletTest</servlet-name>
        <url-pattern>/ServletTest</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>requestTest</servlet-name>
        <servlet-class>com.weq.requestTest</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>requestTest</servlet-name>
        <url-pattern>/requestTest</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>reponseTest</servlet-name>
        <servlet-class>com.weq.reponseTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>reponseTest</servlet-name>
        <url-pattern>/reponseTest</url-pattern>
    </servlet-mapping>
</web-app>

reponseTest.java代码如下:

package com.weq;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class reponseTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        ServletOutputStream outputStream = response.getOutputStream();
        PrintWriter writer = response.getWriter();
        writer.write("你好,响应请求");
    }
}

测试结果如下:
在这里插入图片描述
发现出现乱码,需要设置响应的字符编码方式
代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        ServletOutputStream outputStream = response.getOutputStream();
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write("你好,响应请求");
    }

测试结果:
在这里插入图片描述

重定向测试redirect

代码如下:

public class reponseTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        ServletOutputStream outputStream = response.getOutputStream();
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write("你好,响应请求");

        response.sendRedirect("form.html"); //跳转到另一个html
    }
}

测试结果
在这里插入图片描述
正常跳转,也可以跳转到其他服务器上,比如www.baidu.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值