Servlet中实现URL重写

1 什么是URL重写

在URL重写中,我们将标记或标识符添加到下一个Servlet或下一个资源的URL。我们可以使用以下格式发送参数名称/值对:

url?name1=value1&name2=value2&??

名称和值使用等号分隔,参数名称/值对与另一个参数使用&符号分隔。当用户单击超链接时,参数名称/值对将被传递到服务器。在Servlet中,我们可以使用getParameter()方法获取参数值。

2 URL重写的优势

  1. 无论是否禁用Cookie(与浏览器无关),它将始终有效。
  2. 不需要在每个页面上提交额外的表单。

3 URL重写的缺点

  1. 它仅适用于URL链接。
  2. 它只能发送文本(字符串)信息。

4 URL重写的案例

在下面的示例中,我们使用URL链接维护用户的状态。为了实现此目的,我们将用户名附加在查询字符串(queryString)中,并从另一页面的查询字符串(queryString)中获取值。

4.1 编写页面

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>一点教程网-URL重写案例</title>
</head>
<body>
<form action="servlet1">
    用户名:<input type="text" name="userName"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

4.2 编写FirstServlet

FirstServlet:

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

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

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

        try{

            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();

            String n=request.getParameter("userName");
            out.print("欢迎 "+n);

            //把用户名追加到查询字符串后面
            out.print("<a href='servlet2?uname="+n+"'>访问</a>");

            out.close();

        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.3 编写SecondServlet

SecondServlet:

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

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class SecondServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

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

        try{

            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();

            //从查询字符串获取用户名
            String n=request.getParameter("uname");
            out.print("你好 "+n);

            out.close();

        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.4 配置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_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>FirstServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>SecondServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

</web-app>

4.5 运行测试

点击“访问”后,通过URL传递了用户名,效果如下:

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码