Java 使用 Servlet进行URL重写

Java 使用 Servlet进行URL重写

URL重写是一个在加载页面时追加或修改任何URL结构的过程。

客户端发出的请求总是一个新的请求,服务器无法识别当前的请求是由一个新的客户端还是以前的同一个客户端发出的。由于HTTP协议的这种特性,网络服务器被称为无状态。
但很多时候,我们在处理请求时应该知道谁是客户端。例如:
在任何社交网站上,从登录到注销,服务器应该知道谁是客户端,这样服务器就可以根据用户的需要管理所有的请求。
这个问题由Servlet中的Session解决。

会话: 会话是客户和服务器之间的一种状态,它包含客户和服务器之间的多个请求和响应。我们知道HTTP和Web服务器都是无状态的,维护会话的唯一方法是在每次请求和响应中在服务器和客户端之间传递一些关于会话的唯一信息(会话ID)。

以下是一些我们可以在请求和响应中提供唯一ID的方法

  • Servlet中的会话接口
  • Cookies管理
  • URL重写

URL重写

如果你的浏览器不支持cookies,URL重写为你提供了另一种会话跟踪的选择。URL重写是一种方法,其中请求的URL被修改以包括会话ID。有几种方法可以进行URL重写。
这里我们讨论的是会话管理技术,我们将控制权从一个Servlet传递给另一个。将控制权从一个Servlet传递给另一个Servlet的语法如下

// SecondServlet is the name of the servlet where you want to pass control
out.print("<a href='SecondServlet?uname=" + n + "'>visit</a>");

注意: 一般来说,我们为请求调度器编写web.xml文件,但在这个例子中,我们使用注解,所以他们不需要创建web.xml文件。

注释的语法是:

@WebServlet("/ServletName") // at the place of ServletName 
we have to write the name of our servlet file and this annotation 
should be written at the starting of class in servlet.

使用注解的URL重写进行会话跟踪的例子

<!-- Save this file as Index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="FirstServlet" method="get">  
Name:<input type="text" name="userName"/><br/>  
<input type="submit" value="submit"/>  
</form>  
</body>
</html>

使用Java Servlet进行URL重写

// Name this file as FirstServlet.java
package GeeksforGeeks;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/FirstServlet") // annotation
  
// this annotation is used for replacing xml file
public class FirstServlet extends HttpServlet {
  
    // class name is FirstServlet which extends HttpServlet
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        try {
            response.setContentType("text/html");
           /* The response's character encoding is only set 
from the given content type if this method 
is called before getWriter is called. 
This method may be called repeatedly to 
change content type and character encoding.*/
            PrintWriter out = response.getWriter();
  
  
            /*T he Java PrintWriter class ( java.io.PrintWriter ) enables you to 
          write formatted data to an underlying Writer . 
         For instance, writing int, long and other primitive data
          formatted as text, rather than as their byte values*/
            String n = request.getParameter("userName");
             
//request.getParameter takes the value from index.html file
  // where name is username
            out.print("Welcome " + n);
  
// out.println is used to print on the client web browser
  
 //url rewriting is used for creating session 
//       it will redirect  you to SecondServlet page
            out.print("<a href='SecondServlet?uname=" + n + "'>visit</a>");
  
            out.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

使用Java Servlet进行URL重写

// Name this file as SecondServlet.java
package GeeksforGeeks;
  
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
  
@WebServlet("/SecondServlet") // annotation
public class SecondServlet extends HttpServlet {
  
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        try {
  
            response.setContentType("text/html");
            /*
             * The response's character encoding is only set from the given
             * content type if this method is called before getWriter is called.
             * This method may be called repeatedly to change content type and
             * character encoding.
             */
            PrintWriter out = response.getWriter();
            /*
             * The Java PrintWriter class ( java.io.PrintWriter ) enables you to
             * write formatted data to an underlying Writer . For instance,
             * writing int, long and other primitive data formatted as text,
             * rather than as their byte values
             */
            // getting value from the query string
            String n = request.getParameter("uname");
            out.print("Hello " + n);
            /* out.println is used to print on the client web browser */
            out.close();
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

使用Java Servlet进行URL重写
程序流程
使用Java Servlet进行URL重写

解释(按图索骥)

当你在eclipse中部署你的项目时,第一个被加载的页面是HTML表单,其表单动作是第一个servlet,所以控件会被送到servlet1。在这种情况下,我们将servlet1命名为FirstServlet,在那里打印用户名。在FirstServlet中,我们提供了url,在那里我们使用url重写将控件转移到servlet2。在我们的案例中,我们将servlet2命名为SecondServlet。

URL重写的优势

  • 它不依赖于cookie,无论cookie是启用还是禁用,都可以工作。
  • 不是所有的页面都需要额外的表单提交

URL重写的缺点

它只对链接起作用,只能发送文本。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程