使用 Servlet 重写 Url
Posted
技术标签:
【中文标题】使用 Servlet 重写 Url【英文标题】:Urlrewriting using Servlet 【发布时间】:2014-03-17 12:25:13 【问题描述】:我是编程新手,我写了两段代码来学习 servlet 中的 urlrewriting:
我的 html 表单是:
<form action="loginhidden" method="get">
Login ID:<input name="login" ><br>
Password:<input name="pass" type="password"><br>
<input type="submit" >
</form>
我的 web.xml 文件是:
<web-app>
<servlet>
<servlet-name>loginhidden</servlet-name>
<servlet-class>loginhidden</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginhidden</servlet-name>
<url-pattern>/loginhidden</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>loginhidden1_name</servlet-name>
<servlet-class>loginhidden1_name</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginhidden1_name</servlet-name>
<url-pattern>/loginhidden1_name/*</url-pattern>
</servlet-mapping>
</web-app>
代码片段如下:
1.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class loginhidden extends HttpServlet
public void doGet(HttpServletRequest req, HttpServletResponse res)throws
ServletException, IOException
res.setContentType("text/html");
PrintWriter out=res.getWriter();
String login= req.getParameter("login");
String pass=req.getParameter("pass");
if(pass.equals("admin"))
out.println(login);
out.println(pass);
out.println("<html><head><form action=loginhidden1_name?
mylogin="+login+">");
out.println("Your Name:<input type=text name=myname><br>");
out.println("<input type=submit>");
out.println("</body></head></html>");
2.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class loginhidden1_name extends HttpServlet
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res )throws
ServletException, IOException
res.setContentType("text/html");
PrintWriter out=res.getWriter();
out.println(req.getParameter("mylogin"));
out.println(req.getParameter("myname"));
我能够在我的第二个 servlet(loginhidden1_name) 中获取 name 的值,但我无法通过 urlrewriting 获取登录 id("mylogin") 的值。我得到它的 null 值。请帮助。
非常感谢提前。
【问题讨论】:
你想要发生什么?在某些情况下,您是否希望将控制权转移到第二个 servlet? 我想从 html 页面(表单)中获取用户的 loginid 的值 .. 将其打印在第一个 servlet 中,然后通过 url 重写将值传递给第二个 servlet 并打印再次。谢谢比尔。 【参考方案1】:您不能在表单操作中使用 URL 重写。后面有参数吗?将被浏览器丢弃。相反,您可以将登录信息添加为第二个表单中的隐藏表单字段:
...
out.println("<input type=hidden name=\"mylogin\" value=\""+login+"\">");
...
这将以与其他字段相同的方式传递到您的第二个 Servlet。
见submitting a GET form with query string params and hidden params disappear
【讨论】:
【参考方案2】:如果您只是希望将控制权从一个 servlet 转移到另一个,只需将请求转发到另一个 servlet。在这种情况下,“转发”不会返回给客户端。
在您的原始 servlet 中,最后,您需要获取一个 RequestDispatcher,并转发到新的 URL。
例如
getServletContext().getRequestDispatcher("/modified/url").forward(request, response);
控制线程将转移到另一个 servlet。 IIRC,您仍将完成第一个 servlet 中的方法调用。即它不会从您的方法返回,然后调用另一个 servlet。
如果您出于某种原因需要对请求进行后处理,则可以利用这一点。尽管 ServletFitler 将是处理这种情况的更合适的方法。
【讨论】:
以上是关于使用 Servlet 重写 Url的主要内容,如果未能解决你的问题,请参考以下文章
创建Servlet类,并重写Servlet接口,配置web.xml文件,实现Servlet访问