JAVAWEB_实验三 Servlet 相关技术

news2024/11/15 8:58:54

文章目录

  • Servlet 基础
    • 一、 实验目的
    • 二、 实验要求
    • 三、 实验内容
  • 过滤器
    • 一、 实验目的
    • 二、 实验原理
    • 三、 实验内容
    • 试简述过滤器有哪些功能?
  • 实现一个查询天气的 web 程序


Servlet 基础

一、 实验目的

理解 Servlet 的工作原理,掌握 Servlet 的应用开发方法;掌握常见 Servlet ;

二、 实验要求

  1. 理解 Servlet 的应用。
  2. 掌握 Servlet 的编程技术。
  3. 熟练使用 Eclipse 开发 Servlet 应用

三、 实验内容

(一)用 Servlet 获取表单数据

  1. 建立一个 Servlet 文件 accept.java 和一个 register.jsp 文件,实现用 Servlet 实现获取表单数据的功能。
    程序功能:利用 Servlet 的方式实现表单数据的获取。
    accept.java
package servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(urlPatterns = {"/accept"})
public class accept extends HttpServlet {
    public String codeToString(String str) {//处理中文字符串的函数
        String s = str;
        try {
            byte tempB[] = s.getBytes("ISO-8859-1");
            s = new String(tempB);
            return s;
        } catch (Exception e) {
            return s;
        }
    }

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//设置mime
        response.setContentType("text/html;charset=GB2312");
        PrintWriter out = response.getWriter();
        out.println("<HTML><head><title>接收新用户注册</title></head><BODY>");
        out.println("这是新用户注册所提交的数据:<br>");
        out.println("用户名是:" + codeToString(request.getParameter("username")) + "<br>");
        out.println("密码是:" + codeToString(request.getParameter("userpassword")) + "<br>");
        out.println("性别是:" + codeToString(request.getParameter("sex")) + "<br>");
        out.println("出生年月是:" + request.getParameter("year") + request.getParameter("month") + request.getParameter("day") + "<br>");
        out.println("电子邮箱是:" + request.getParameter("email") + "<br>");
        out.println("家庭住址是:" + codeToString(request.getParameter("address")) + "<br>");
        out.println("</body> </html>");
    }
}


register.jsp

<%@ page contentType="text/html;charset=gb2312" %>
<script language="javascript">  function on_submit() {//验证数据的合法性
    if (form1.username.value == "") {
        alert("用户名不能为空,请输入用户名!");
        form1.username.focus();
        return false;
    }
    if (form1.userpassword.value == "") {
        alert("用户密码不能为空,请输入密码!");
        form1.userpassword.focus();
        return false;
    }
    if (form1.reuserpassword.value == "") {
        alert("用户确认密码不能为空,请输入密码!");
        form1.reuserpassword.focus();
        return false;
    }
    if (form1.userpassword.value != form1.reuserpassword.value) {
        alert("密码与确认密码不同");
        form1.userpassword.focus();
        return false;
    }
    if (form1.email.value.length != 0) {
        for (i = 0; i < form1.email.value.length; i++)
            if (form1.email.value.charAt(i) == "@")
                break;
        if (i == form1.email.value.length) {
            alert("非法 EMail 地址!");
            form1.email.focus();
            return false;
        }
    } else {
        alert("请输入 Email!");
        form1.email.focus();
        return false;

    }
}
</script>
<html>
<head>
    <title>新用户注册</title>
</head>
<body>
<form method="POST" action="accept.jsp" name="form1" onsubmit="return on_submit()">
    新用户注册<br>
    用户名(*)<input type="text" name="username" size="20"><br>&nbsp;(*)<input type="password" name="userpassword" size="20"><br>
    再输一次密码(*)<input type="password" name="reuserpassword" size="20"><br>
    性别:<input type="radio" value="男" checked name="sex"><input type="radio" name="sex" value="女"><br>
    出生年月:<input name="year" size="4" maxlength=4><select name="month">
        <option value="1" selected>1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="8">7</option>
        <option value="9">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
    </select><input name="day" size="3" maxlength=4><br>
    电子邮箱(*)<input name="email" maxlength=28><br>
    家庭住址:<input type="text" name="address" size="20"><br>
    <input type="submit" value="提交" name="B1">
    <input type="reset" value="全部重写" name="B2"><br>
</form>
</body>
</html>

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

过滤器

一、 实验目的

  1. 了解过滤器的作用;
  2. 掌握过滤器的开发与部署的步骤;
  3. 了解过滤器链。

二、 实验原理

过滤器是 web 服务器上的组件,它们对客户和资源之间的请求和响应进行过滤。
过滤器的工作原理是:当servlet容器接收到对某个资源的请求,它要检查是否有过滤器与之关联。如果有过滤器与该资源关联,servlet容器将把该请求发送给过滤器。在过滤器处理完请求后,它将做下面3件事:

  • 产生响应并将其返回给客户;
  • 如果有过滤器链,它将把(修改过或没有修改过)请求传递给下一个过滤器;
  • 将请求传递给不同的资源。当请求返回到客户时,它是以相反的方向经过同一组过滤器返回。过滤器链中的每个过滤器够可能修改响应。

过滤器 API 主要包括:Filter、FilterConfig 和 FilterChain 接口。

三、 实验内容

编写一个过滤器改变请求编码
【步骤 1】编写一个 loginform.html 文件,代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用过滤器改变请求编码</title>
    <meta http-equiv="Content-Type" content="text/html;charset=GB2312">
</head>
<body>
<center>
    <h2>请输入用户名和口令:</h2>
    <form method="post" action="servlet/CheckParamServlet">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input name="name" type="text"></td>
            </tr>
            <tr>
                <td>口 令:</td>
                <td><input name="pass" type="password"></td>
            </tr>
            <tr>
                <td></td>
                <td>
                    <input name="ok" type="submit" value="提交">
                    <input name="cancel" type="reset" value="重置">
                </td>
            </tr>
        </table>
    </form>
</center>
</body>
</html>


【步骤 2】编写处理请求参数的 Servlet

package servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CheckParamServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
            throws ServletException, IOException {
        String name = request.getParameter("name");
        String pass = request.getParameter("pass");
        response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        out.println("<html><head><title>Param Test</title></head>");
        out.println("<h3 align=center>你的用户名为:" + name + "</h3>");
        out.println("<h3 align=center>你的口令为:" + pass + "</h3>");
        out.println("</body></html>");
    }

    public void doPost(HttpServletRequest request,
                       HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

【步骤 3】修改 web.xml 文件,加入下面代码:

<web-app>

    <servlet>
        <servlet-name>CheckParamServlet</servlet-name>
        <servlet-class>servlet.CheckParamServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CheckParamServlet</servlet-name>
        <url-pattern>/servlet/CheckParamServlet</url-pattern>
    </servlet-mapping>

</web-app>

【步骤 4】在浏览器的地址栏中输入下面 URL: http://localhost:8080/ helloapp/loginform.html
输入用户名和口令,如下图所示:
在这里插入图片描述

然后点击“提交”按钮,经 CheckParamServlet 处理后返回的结果如下图所示:
在这里插入图片描述
【步骤 5】过滤器代码如下:

package filter;

import java.io.IOException;
import javax.servlet.*;

public class EncodingFilter implements Filter {
    protected String encoding = null;
    protected FilterConfig config;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
// 得到在 web.xml 中配置的编码
        this.encoding = filterConfig.getInitParameter("Encoding");
    }

    public void doFilter(
            ServletRequest request,
            ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (request.getCharacterEncoding() == null) {
// 得到指定的编码
            String encode = getEncoding();
            if (encode != null) {
//设置 request 的编码
                request.setCharacterEncoding(encode);
                response.setCharacterEncoding(encode);
            }
        }
        chain.doFilter(request, response);
    }

    protected String getEncoding() {
        return encoding;
    }

    public void destroy() {
    }
}


【步骤 6】在 web.xml 文件中配置过滤器,加入下面代码:

<?xml version="1.0" encoding="UTF-8"?>

<web-app>
    <servlet>
        <servlet-name>CheckParamServlet</servlet-name>
        <servlet-class>servlet.CheckParamServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CheckParamServlet</servlet-name>
        <url-pattern>/servlet/CheckParamServlet</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>Encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

【步骤 7】重复第(4)步操作,结果如下:
在这里插入图片描述

试简述过滤器有哪些功能?

答:本题过滤器的作用是在客户端和服务端之间指定 request 的编码,对乱码问题进行修改,从而将乱码转变为中文编码!主要含义是客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
如何理解过滤器链。
答:在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。过滤器能够对网站中的各种内容进行过滤(页面、Servlet、图片、文件),可以在网站内容请求和响应时进行一些操作,完成一些通用的功能。

实现一个查询天气的 web 程序

使用表单完成城市的输入,提交使用 ajax 完成查询显示;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
</head>
<body>
<input type="text" id="tel"/>
<button id="ajax">天气预报</button>
<p><span id="reslut"></span></p>
<script src="//apps.bdimg.com/libs/jquery/2.1.2/jquery.min.js"></script>
<script src="//apps.bdimg.com/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<script type="text/javascript">
    $(function () {
        $('#ajax').on('click', function () {
            var $telValue = $('#tel').val();
            if ($telValue == "") {
                alert('不能为空!');
                return;
            }
            $.ajax({
                type: 'GET',
                dataType: 'jsonp',
                jsonp: 'callback',
                jsonpCallback: 'getName',
                url: 'http://api.asilu.com/weather/',
                data: {
                    "city": $telValue
                },
                success: function (data) {
                    var reslutData = data;
                    console.log(reslutData);
                    $('#reslut').text(reslutData.city + "明天的天气:"
                        +reslutData.weather[0].weather
                        +reslutData.weather[0].wind
                        +reslutData.weather[0].temp
                        +reslutData.weather[0].date
                    );},

            })
        })
    })
</script>
</body>
</html>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kanzi:项目实例:大灯Lamp界面设计

概述&#xff1a; 大灯页面&#xff08;LampPage&#xff09;主要包括&#xff1a;OFFbtn、Autobtn、ParkLampbtn、HeadLampbtn 这个四个 状态。我们就先简单的分析下。 1: LampPageController 页面 这个controller页面维护两个页面&#xff08;FirstPage和SecondPage&#…

LeetCode刷题复盘笔记—一文搞懂0 - 1背包之474. 一和零问题(动态规划系列第十篇)

今日主要总结一下动态规划0-1背包的一道题目&#xff0c;474. 一和零问题 题目&#xff1a;416. 分割等和子集 Leetcode题目地址 题目描述&#xff1a; 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多…

【servelt原理_9_servlet应用___】

servlet应用*** 1.request对象 是当客户端向服务器端发送请求时&#xff0c;服务器为本次请求创建request对象&#xff0c;并在调用Servlet的service方法时&#xff0c;将该对象传递给service方法。Request对象中封装了客户端发送过来的所有的请求数据。 ①:doGet()方法接收r…

Maven详细总结

参考博客&#xff1a;https://blog.csdn.net/xiaodi2016/article/details/121341063 ※注意&#xff1a; 我们自己的Maven工程必须执行安装操作才会进入仓库。安装的命令是&#xff1a;mvn install 任何一个Maven工程会根据坐标到本地仓库中去查找它所依赖的jar包…

临近过年无情被裁,我面试大厂的这几个月…

秋招接近尾声&#xff0c;即将远去的“金九银十”今年也变成了“铜九铁十”。 大厂不断缩招&#xff0c;不容忽视的疫情影响&#xff0c;加上不断攀升的毕业生人数&#xff0c;各种需要应对的现实问题让整个求职季难上加难。 在这个异常残酷的求职季&#xff0c;很多人的困惑…

【intent-filter】AndroidManifest中<intent-filter>标签的 部分作用

这里写自定义目录标题AndroidManifest.xmlIntent-filter 标签Intent-filter 标签中的常用元素Intent-filter 标签的作用Intent对象Intent显式启动活动窗口Intent隐式启动&#xff08;重要&#xff09;AndroidManifest.xml AndroidManifest.xml是安卓开发中主配置文件&#xff…

【负荷预测】基于蚂蚁优化算法的BP神经网络在负荷预测中的应用研究(Matlab完整代码实现)

目录 0 知识回顾 1 ACO-BP算法 2 ACO-BP算法基本思路 3 具体步骤 4 Matlab代码实现 5 运行结果 6 参考文献 7 写在最后 0 知识回顾 智能优化算法—蚁群算法&#xff08;Python实现&#xff09; 1 ACO-BP算法 传统的BP神经网络训练采用的是误差反向传播学习算法,它的…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教室申请管理系统yf80k

计算机毕业设计的编程真的不会, 应该怎么办啊, 平时学了3年都没学懂&#xff0c;然而还有一个月就要答辩了&#xff0c;一点东西都没做出来&#xff0c;不知道该怎么办了&#xff1f;好迷茫&#xff0c;如果毕不到业怎么办, 有没有快速的学习方法 毕设毕设&#xff0c;最终的是…

【C++面向对象程序设计】CH7 输入输出流

目录 一、前言 二、标准输出流 1.流对象 &#xff08;1&#xff09;cout流对象 &#xff08;2&#xff09;cerr流对象 &#xff08;3&#xff09;【例7.1】编写程序&#xff0c;从键盘输入a&#xff0c;b&#xff0c;c的值求解一元二次方程。如果a0或判别式的值<0&…

拾壹博客拆解改造,页面元素替换(二)

页面元素替换 首先要做的当然是换成自己风格的站名和内容啦。 1、网站配置 跟踪前端代码后发现配置是来自后端接口&#xff0c;想着既然入库了&#xff0c;那应该有对应的管理页面吧&#xff0c;果然找到了&#xff0c;就是…演示账号不允许操作&#xff01;那么接下来要干的…

stm32f767的fft

仅作自己笔记用 1&#xff0c;FFT函数调用基础知识 采样得到的数字信号&#xff0c;就可以做FFT变换了。N个采样点&#xff0c;经过FFT之后&#xff0c;就可以得到N个点的FFT结果。为了方便进行FFT运算&#xff0c;通常N取2的整数次方。 假设采样频率为Fs&#xff0c;信号频率…

基于Java环境下的高校跳蚤市场商城系统

目 录 摘 要 I Abstract II 1绪论 1 1.1 课题背景 1 1.2 目的和意义 1 1.3 研究现状 2 1.4 研究主要内容 3 2开发平台与技术的介绍 4 2.1 Eclipse简介 4 2.2 Java EE简介 4 2.2.1 Java EE概念 4 2.2.2 Java EE运行模式 4 2.3 Jsp技术简介 5 2.4 Struts 2框架简介 5 2.5 MySQL简…

[附源码]计算机毕业设计springboot新冠疫苗接种预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Docker最新超详细教程——Docker创建运行Redis并挂载

Docker最新超详细教程——Docker创建运行Redis并挂载 Docker官网关于Redis的描述 redis - Official Image | Docker Hubhttps://hub.docker.com/_/redis 一、拉取Redis镜像 docker pull <镜像名称>:<版本号> docker pull redis:6.2.27 首先我们要在Docker上获取…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教学过程管理系统34085

现在毕设刚开始。时间还有很多&#xff0c;可以从头开始学也可以。毕设其实不难&#xff0c;难的是我们懒散到这种时候再去静下心学。能自己独立完成尽量自己独立完成。相信你看过很多上面回答的&#xff0c;都不建议去某宝。毕竟这一行参差不齐哈。能找到靠谱的也不容易。近期…

Unity Debug的简单封装

对Unity Debug的简单封装 使用前提&#xff1a; Project Settings-Player-Other Settings-Script Define Symbols添加 EnableLog&#xff0c;点击Apply 测试代码&#xff1a; using MTools.Debuger; using UnityEngine;public class NewBehaviourScript : MonoBehaviour {p…

基于PHP+MySQL家庭医生签约预约诊疗管理信息系统

随着时代的发展,人们对医疗方面的要求也越来越高,也是人们更希望通过家庭医生来对自己提供所需的医疗服务,从而享受更加个性化的医疗服务,为此我们开发了本家庭医生签约预约诊疗管理信息系统,通过本系统患者可以享有签约,预约,和诊疗等一系类的服务。 本系统是一个家庭医生签约…

[附源码]Python计算机毕业设计Django基于微信小程序的网络办公系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

qmake 参数

E:\workspace\QtWork\qmake\option.cpp:Option::init() -project 设置qmake生成工程相关文件&#xff0c;如果用qt creator开发的话这个命令参数基本用不到。 -prl 设置qmake生成prl文件。 -set 设置自定义属性&#xff0c;会存放到注册表中。具体参考属性 -unset 取消自定义…

网页JS自动化脚本(六)在特定位置添加元素

在某元素后插入元素 我们这一次在按钮元素后面复制一个一模一样的按钮,所以分为几个步骤,先新建一个一样的元素,然后把相同中的属性赋值给它,再插入到合适的位置,最后再稍微修改一下外观样式即可 首先新建一个input元素,看一下效果 window.onloadfunction(){var theElementdo…