Web技术5——servlet小练习汇总

入门案例见前面引入

实现登录

要实现效果:

在这里插入图片描述

代码:

login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>

<!--
action就是表单数据提交路径:
相对路径:相对路径,路径不以"/"开头,会把路径拼接到当前路径的后面
    目标路径:http://localhost:8080/login
    当前路径:http://localhost:8080/login.html
-->
<form action="login" method="post">
    用户名<input type="text" name="username"><br>
    密码<input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>

</body>
</html>


LoginServlet:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取客户端提交的请求参数:客户端携带过来的请求参数都在request对象中
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2.校验客户端提交的用户名和密码是否正确
        if ("tom".equals(username) && "123456".equals(password)){
            //登录成功
            //将校验结果响应给客户端
            response.getWriter().write("login success!!!");
        }else {
            //登录失败
            //将校验结果响应给客户端
            response.getWriter().write("login failed!!!");
        }
    }
}

统计网站被访问的总次数

需求:

在页面中显示您是第x位访问的用户.
在这里插入图片描述

代码:

CountServlet

@WebServlet("/count")
public class CountServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取容器中计数器原本的次数
        ServletContext servletContext = getServletContext();
        Object count = servletContext.getAttribute("count");

        //判断servletContext中是否有计数器
        if (count == null) {
            //说明是第一次访问
            //就往servletContext中添加一个计数器
            servletContext.setAttribute("count", 1);
        } else {
            //说明不是第一次访问,那么我们就要对原来的计数器+1,再存进去
            int number = ((int) count) + 1;
            servletContext.setAttribute("count",number);
        }

        //2.向客户端响应
        response.getWriter().write("Welcome!!!");
    }
}

ShowServlet

@WebServlet("/show")
public class ShowServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从容器里面获取计数器
        ServletContext servletContext = getServletContext();

        int count = (int) servletContext.getAttribute("count");

        //将count响应给客户端
        response.getWriter().write("access count is:" + count);
    }
}

ServletContext

作为域对象存取值

package com.gavin.servlet;

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

@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String aaa = "hello";
        //将aaa存储到ServletContext对象中
        //1.调用getServletContext()方法获取ServletContext对象
        ServletContext servletContext = getServletContext();
        //2.调用servletContext对象的setAttribute(String name, Object object)
        servletContext.setAttribute("aaa",aaa);
    }
}


@WebServlet("/demo2")
public class ServletDemo2  extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.调用getServletContext()方法获取ServletContext对象
        ServletContext servletContext = getServletContext();
        //2.调用servletContext对象的getAttribute(String name)
        String aaa = (String) servletContext.getAttribute("aaa");

        System.out.println("在ServletDemo2中获取aaa的值为:"+aaa);
    }
}

获得文件mime-type

@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //根据文件名获得文件的mini类型
        //1.获得ServletContext对象
        //2.调用getMimeType(String file)方法
        String file1 = "a.mp3";
        String file2 = "b.png";
        String mimeType1 = getServletContext().getMimeType(file1);
        String mimeType2 = getServletContext().getMimeType(file2);

        System.out.println("ServletDemo3..."+mimeType1+" , "+mimeType2);
    }
}

获得全局初始化参数

<!--全局的初始化参数,通过ServletContext来获得的,也就意味着任何Servlet都可以获得-->
<context-param>
    <param-name>akey</param-name>
    <param-value>aaa</param-value>
</context-param>
//2.获得全局初始化参数
String value = getServletContext().getInitParameter("akey");
System.out.println("value="+value);

获取web资源路径

/*
目标:使用字节输入流,读取timg.jpg图片
    方法1:FileInputStream
    方法2:ClassLoader
    方法3:ServletContext
 */
@WebServlet("/demo5")
public class ServletDemo5 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //方法1:FileInputStream
//        InputStream is = new FileInputStream("D:\\工作\\公司培训_长训4班\\03_javaweb\\day08\\day08\\day08_03_servletContext\\web\\img\\timg.jpg");
        //方法2:ClassLoader将文件转换成流
//        InputStream is= ServletDemo5.class.getClassLoader().getResourceAsStream("../../timg.jpg");
        //方法3:ServletContext可以获取web里面的资源的真实路径
        ServletContext servletContext = getServletContext();
//        String realPath = servletContext.getRealPath("img/timg.jpg");
        InputStream is = servletContext.getResourceAsStream("img/timg.jpg");
        System.out.println(is);
    }
}

request

请求转发

@WebServlet("/demo5")
public class ServletDemo5 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用请求转发跳转到index1.html页面
        //相对路径:不以/开头的路径写法,是以目标资源相对当前资源的路径
        //绝对路径:以/开头的路径写法,对于请求转发而言在完整url的基础上省去“项目路径”,对于非请求转发而言在完整url的基础上省略“服务器路径”
        //完整url:http://localhost:8080/项目名/资源名
        request.getRequestDispatcher("/index1.html").forward(request,response);
    }
}

request做域对象取值

package com.gavin.servlet;

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

@WebServlet("/demo6")
public class ServletDemo6 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        request域对象的作用范围只在一次请求之间
        所以request作为域对象存取值必须和请求转发一起使用
         */

        String str = "张三";
        //将str存入域对象
        request.setAttribute("str",str);

        //跳转到ServletDemo7
        request.getRequestDispatcher("demo7").forward(request,response);
    }
}
@WebServlet("/demo7")
public class ServletDemo7 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //将str取出域对象
        String str = (String) request.getAttribute("str");
        System.out.println(str);
    }
}

response

定时刷新

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //服务器告诉浏览器5s后跳转到百度
        response.setHeader("Refresh","5;url=https://www.baidu.com");
    }
}

重定向

@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //重定向跳转:让浏览器进行页面
        //设置响应状态码
        /*response.setStatus(302);
        //跳转百度首页
        response.setHeader("Location","https://www.baidu.com");*/

        //设置重定向的简单方式
//        response.sendRedirect("https://www.baidu.com");
//        response.sendRedirect("WEB-INF/index1.html");     404

        //请求转发跳转到WEB-INF中的index1.html
        request.getRequestDispatcher("WEB-INF/index1.html").forward(request,response);
    }
}

完成文件下载

需求

• 创建文件下载的列表的页面,点击列表中的某些链接,下载文件.

分析

1)什么是文件下载
将服务器上已经存在的文件,输出到客户端浏览器.
说白了就是把服务器端的文件拷贝一份到客户端,文件的拷贝—>流(输入流和输出流)的拷贝

2)文件下载的方式
• 第一种:超链接方式(不推荐)
链接的方式:直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式(eg: png, jpg…)的文件,那么直接打开,不再下载了
• 第二种:手动编码方式(推荐)
手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会下载.

思路分析

1)超链接方式

  1. 准备下载的资源(文件)
  2. 编写一个下载页面
  3. 在这个页面和是哪个定义超链接,指定href
    2)编码方式
    手动编码方式要求:设置两个头和一个流
    设置两个头:
    Content-Disposition:服务器告诉浏览器去下载
    设置一个流:
    获得要下载文件的输入流

编码

  1. 获得文件名fileName
  2. 设置两头一流
    a) 一流,根据文件名获得文件输入流
    b) 一头,告诉浏览器文件的MIME类型
    c) 一头,告诉浏览器去下载
  3. 通过response获得输出流(字节流)
  4. 流的操作

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下载页面</title>
</head>
<body>

<h1>超链接方式直接下载</h1>
<a href="file/banner_1.jpeg">下载banner_1.jpeg</a><br>
<a href="file/banner_1.rar">下载banner_1.rar</a><br>


<h1>自定义Servlet进行下载</h1>
<a href="download?fileName=banner_1.jpeg">下载banner_1.jpeg</a><br>
<a href="download?fileName=banner_1.rar">下载banner_1.rar</a><br>
<a href="download?fileName=1.jpeg">下载1.jpeg</a><br>

</body>
</html>

servlet

@WebServlet("/download")
public class ServletDownload extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取客户端想要下载的文件名
        String fileName = request.getParameter("fileName");

        //2.设置下载的文件的mime-type
        String mimeType = getServletContext().getMimeType(fileName);
        response.setHeader("Context-Type",mimeType);

        //3.使用字节输入流,读取客户端要下载的是那个文件
        InputStream is = getServletContext().getResourceAsStream("file/" + fileName);

        //4.使用字节输出流,将图片输出到浏览器
        ServletOutputStream os = response.getOutputStream();

        //输出之前,我们通过设置响应的方式,指示客户端下载文件
        //我们先将fileName进行URL编码
        String encodeFileName = URLEncoder.encode(fileName, "UTF-8");

        // 设置相应类型 application/octet-stream
        response.setContentType("application/x-msdownload");

        response.setHeader("Context-Disposition","attachment;filename="+encodeFileName);

        IOUtils.copy(is,os);

        os.close();
        is.close();
    }
}

综合案例注册登录(使用数据库)

注册

需求

在这里插入图片描述

登录

需求

• 点击登录按钮, 进行登录.
• 登录成功,显示login Success
• 登录失败,显示login failed
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值