我是编程新手,我编写了两段代码来学习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获取login id(“mylogin”)的值。我得到它的null值。请帮助。
非常感谢提前。
答案 0 :(得分:0)
如果您只是想将控制从一个servlet转移到另一个servlet,那么将请求转发给另一个servlet就是一件简单的事情。在这种情况下,“前进”不会回到客户端。
在原始的servlet中,最后,您需要获取RequestDispatcher,然后转发到新的URL。
e.g。
getServletContext().getRequestDispatcher("/modified/url").forward(request, response);
控制线程将转移到另一个servlet。在IIRC中,您仍将在第一个servlet中完成方法调用。即它不会从您的方法返回,然后调用另一个servlet。
如果您因某种原因需要对请求进行后期处理,则可以利用此功能。虽然ServletFitler是处理这种情况的更合适的方法。
答案 1 :(得分:0)
您无法在表单操作中使用URL重写。之后的任何参数?将被浏览器删除。相反,您可以将登录名添加为第二种形式的隐藏表单字段:
...
out.println("<input type=hidden name=\"mylogin\" value=\""+login+"\">");
...
这将以与其他字段相同的方式传递到您的第二个Servlet。
请参阅submitting a GET form with query string params and hidden params disappear