提交 HTML 表单后,servlet 操作出现在 URL 而不是 JSP 文件中

2024-01-04

我创建了一个简单的登录页面。如果用户输入正确的用户名和密码,页面将被重定向到成功页面,否则它将被重定向到索引页面。在登录页面中,我向 servlet 提供了表单提交操作。一旦 servlet 验证输入,它将分派到相应的 jsp 页面。我的问题是操作名称在调度后仍然在 url 中。这样对吗?

package com.123.www;

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

public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Login() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {

        response.setContentType("text/html");

        //PrintWriter out = response.getWriter();

        String userName = request.getParameter("username");

        String passWord = request.getParameter("password");

        RequestDispatcher view = null ;

        if((userName=="")&&(passWord==""))
        {
            view = request.getRequestDispatcher("index.jsp");
        }
        else
        {   
            HttpSession session = request.getSession(true);
            session.setAttribute("name",userName);
            view = request.getRequestDispatcher("success.jsp");
        }

        view.forward(request, response);

    }

}

调度发生在服务器端,而不是客户端。转发基本上告诉 servlet 容器使用哪个视图来呈现结果。它的位置确实没有出现在客户端的浏览器地址栏中。仅当您使用重定向而不是response.sendRedirect()。重定向基本上告诉网络浏览器在给定位置触发新的 GET 请求。此时浏览器地址栏将更改为新的 URL。

只需隐藏视图(JSP 文件)即可/WEB-INF文件夹,以便最终用户不再直接访问它,并重用相同的 servlet 通过以下方式显示登录表单doGet()并继续处理通过以下方式提交的登录表单doPost()。如果你不实施doGet()然后它会显示HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET https://stackoverflow.com/questions/5370633/405-http-method-get-is-not-supported-by-this-url.

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

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Just show form.
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Process form submit.
        // ...

        if (success) {
            response.sendRedirect("home");
        } else {
            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
        }
    }

}

这样你就可以通过以下方式获取登录页面http://example.com/context/login http://example.com/context/login并提交到相同的 URL。

您可以借助单个 servlet 对所有其他 URL 执行相同的操作前控制器模式 https://stackoverflow.com/questions/3541077/design-patterns-web-based-applications/。这只是一点工作,这也是 MVC 框架存在的原因:)

也可以看看:

  • 我们的 Servlet wiki 页面 https://stackoverflow.com/tags/servlets/info
  • RequestDispatcher.forward() 与 HttpServletResponse.sendRedirect() https://stackoverflow.com/questions/2047122/requestdispatcher-interface-vs-sendredirect/2048640#2048640
  • Servlet 中的 doGet 和 doPost https://stackoverflow.com/questions/2349633/doget-and-dopost-in-servlets/
  • 基于网络的应用程序设计模式 https://stackoverflow.com/questions/3541077/design-patterns-web-based-applications
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提交 HTML 表单后,servlet 操作出现在 URL 而不是 JSP 文件中 的相关文章

随机推荐

  • 如何在 django 中将列表从视图传递到模板

    我正在尝试将列表从 Django 中的视图传递到模板 在我的文件 wiew py 中 我定义了名为 hour 的视图 This Python file uses the following encoding utf 8 from djang
  • NSKeyedArchiver 和 NSKeyedUnarchiver 与 NSMutableArray

    我希望这与我在这里使用可变数组这一事实无关 但这让我感到困惑 所以如果是这种情况 我也不会感到惊讶 背景 我制作了一个小型数据库 它本质上是一个包含自定义对象的 NSMutableArray 我们可以将其称为 recordObjects 我
  • 如何在 MAC OS X 应用程序中更改 NSTableView 标题背景颜色?

    我已经尝试了所有找到的建议解决方案 但最终将此作为最接近的 目标是为以下对象提供自定义颜色 完整的标题背景 例如绿色 文字 例如白色 排序控件颜色 例如白色 目前 我只能正确设置内部背景和文本颜色 同时将标题边框和排序控件保留为默认白色 我
  • 为什么vertical-align: middle不能与表格单元格中的输入元素一起使用?

    这是我的代码 vertical align top margin 0 td vertical align middle border 1px solid red td nth child 1 line height 3em td nth c
  • 在sql中转换excel百分位公式

    PERCENTILE C2 C11080 E2 E11080 G2 G11080 73 上面的公式是Excel百分位数公式 我想将其转换为SQL 11080是该列的计数 如果有人可以帮助我 那将会非常有帮助 我相信percentile co
  • PhoneGap 和 Cordova 之间的区别以及我们应该安装哪一个?

    我的任务是开发 Android 和 iOS 应用程序PhoneGap http phonegap com http phonegap com 然而 当我读到时 事情开始变得非常复杂 有些人说Cordova http cordova apac
  • 不支持 Hive 方法

    我正在尝试使用 Hive 作为底层数据存储来运行 SQl 查询 该查询调用 Big Decimal 函数并引发以下错误 不支持该方法 org apache hadoop hive jdbc HivePreparedStatement set
  • 以编程方式检测 Android 屏幕覆盖

    有没有办法让应用程序能够 检查其顶部是否存在屏幕覆盖层 以及 找出哪个包名称拥有覆盖层 我知道 Android M 及更高版本能够在权限页面中检测屏幕覆盖 并在检测到屏幕覆盖时拒绝权限更改 但开发人员是否能够在应用程序层实现相同的功能 您可
  • 在 Python 中随时插入解释器

    我知道如何使用口译员pdb and IPython 但这需要我事先确切地知道我想在哪里停止 然而 我经常运行需要几分钟到几小时的数字处理脚本 我想确切地知道它的进展情况 一种解决方案是简单地在各处放置大量日志记录语句 但随后我要么被太多信息
  • 数据库更新后nodejs自动刷新视图

    每次函数对数据库进行更改时 我想使用 nodeJS 刷新我的视图 如果我们以 MEAN stack 为例 我不想每 x 秒发送一个 http request 来检查数据库是否已进行更改 我希望前端能够自动收到通知 然后更新视图 这方面的最佳
  • clang 和 gcc 不实现 std::hardware_{constructive,virtual}_interference_size 的原因是什么?

    我知道答案可能是他们没有优先考虑它 但这确实感觉像是故意遗漏 他们已经拥有大量 C 20 核心语言 库功能 而这个 C 17 功能仍然没有实现 其实按照这个table https en cppreference com w cpp comp
  • 如何抑制Windows命令输出?

    我通过命令行移动数千个文件 并将所有文件名打印到控制台 有没有办法忽略输出以便它可以更快 类似于 Linux 中到 dev null 的管道 Thanks bla bla bla bla bla bla bla bla 2 gt nul
  • java泛型中的类型见证

    我从 Java 文档中的 Generics Trail 中看到什么是类型见证 BoxDemo
  • 如何在网格框中随机填充颜色

    如何在网格框中随机填充颜色 而不是如图所示有序 网格 http www freeimagehosting net uploads 4ed76557de jpg http www freeimagehosting net uploads 4e
  • 如何打印单个 JPanel 的内容?

    我有一个JPanel有两个带图片的标签 我需要打印这些内容JPanel 请帮帮我 我怎样才能只打印这个JPanel的内容 因为我的上也有不同的组件JFrame但我只需要打印this JPanel Thanks 下面是打印任何 Swing 组
  • 在打字稿中获取枚举键作为联合字符串的通用类型?

    考虑以下打字稿枚举 enum MyEnum A B C 如果我想要另一种类型 即该枚举键的联合字符串 我可以执行以下操作 type MyEnumKeysAsStrings keyof typeof MyEnum A B C 这非常有用 现在
  • 在 iOS 8 - iOS 11 中从操作表委托以模态方式呈现视图控制器

    所以我注意到在 iOS8 beta 3 中 Update 在 iPad 上的 iOS 11 2 中 当尝试从委托方法中呈现视图控制器时 仍然会发生这种情况UIActionSheet 什么也没发生 并且日志消息输出到调试控制台 表明在转换警报
  • Windows 7 计算机上的 WAMP Server 2 托盘图标中的菜单不可用

    我已在 Windows 7 计算机上下载并安装了 WAMP Server 版本 2 1d 当我从 开始 菜单中选择 启动 WAMP 服务器 时 会出现托盘图标 但没有任何功能 当我将鼠标悬停时 工具提示告诉我 2 个服务中的 1 个已启动
  • CakePHP 中的 .ctp 文件有何用途?

    我开始使用 CakePHP 并且正在阅读manual http book cakephp org view 57 Controller Methods 大约在页面的中间 有这样的评论 Render the element in views
  • 提交 HTML 表单后,servlet 操作出现在 URL 而不是 JSP 文件中

    我创建了一个简单的登录页面 如果用户输入正确的用户名和密码 页面将被重定向到成功页面 否则它将被重定向到索引页面 在登录页面中 我向 servlet 提供了表单提交操作 一旦 servlet 验证输入 它将分派到相应的 jsp 页面 我的问