我是新来的JSP和Servlet。 我的情况如下
我有有它的一个形式的jsp页面。 有两个字段。 jsp页面中的一小段代码片段如下。
MyFirstJSP.jsp文件
<body>
<h1> This is my first jsp and servlet project</h1>
<%
//System.out.println(request.getAttribute("fname"));
if(request.getAttribute("fname")!=null){
System.out.println(request.getAttribute("fname"));
}else{
System.out.println("No request ");
}
%>
<form action="MyFirstServlet" method="get">
First Name<input type="text" name="fname" value= ${fname}><br>
Last Name<input type="text" name="lname" value= ${lname}>
<input type="submit" value="Send">
</form>
</body>
当我提出这种形式的MyFirstServlet被称为该检查由用户输入的名字。 如果第一个名字等同于“ABC”,然后将servlet的请求对象,并把它重定向到网页上面,即在callsing jsp页面的属性。 这将得到请求对象的值并填写到表格的各个领域。 我有Java的语言表达为过同样的效果。
这里是我的MyFirstServlet.java的servlet文件的一小段代码片段
/**
* Servlet implementation class MyFirstServlet
*/
public class MyFirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyFirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub
String firstname=request.getParameter("fname");
if(firstname.equalsIgnoreCase("abc")){
System.out.println("Setting attributes");
request.setAttribute("fname",firstname);
request.setAttribute("lname",request.getParameter("lname"));
response.sendRedirect("MyFirstJSP.jsp");
}else{
System.out.Println("No problem");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter p=response.getWriter();
p.println("Success!");
doGet(request,response);
}
}
但是,当我执行的代码在servlet重定向到JSP页面,但不填充与相应值的表单字段。 由于发现我已经添加了的if-else块知道原因,我结识了请求对象属性的原因这里就不可用。
如果我使用请求调度器在这种情况下,则值变得可用,形式获取填充值,但在地址栏中的网址并不恰克始终显示的URL的servlet。
所以我的查询
** 1)为什么使用的sendRedirect请求对象不可用于jsp页面。
2)是THRE任何其他的方式来显示我在与用户输入的值预填充jsp页面表单如果servlet sendredirects到调用JSP,使用户不必重新输入到表单中的数据。**
请指导我的朋友在这个问题谢谢!
您需要转发到服务器端JSP页面,作为重定向是客户端操作(踩点头1 )请求属性迷路。
更换
response.sendRedirect("MyFirstJSP.jsp");
同
request.getRequestDispatcher("MyFirstJSP.jsp").forward(request, response);
编辑:对不起,我跳过这部分
如果我使用请求调度器在这种情况下,则值变得可用,形式获取填充值,但在地址栏中的网址并不恰克始终显示的URL的servlet。
不过,你不能传递时重定向请求属性到JSP(因为我已经在它上面提到的是一个客户方的动作)
我建议做以下几点:
- 实施的doGet只用于呈现包含表单的页面
- 实施的doPost处理提交的表单数据
- 使用POST而不是GET在HTML表格提交表单
在两者的doGet和doPost,使用正呈现*的.jsp页面。
GET / MyFirstServlet - >着MyFirstJSP.jsp
POST / MyFirstServlet - 前进>以MyFirstJSP.jsp
这是最常用的清洁方法。
编辑2:简单的例子
SimpleFormServlet.java
public class SimpleFormServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String VIEW_NAME = "/WEB-INF/jsp/simpleForm.jsp";
private static final String MODEL_NAME = "form";
public SimpleFormServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute(MODEL_NAME, new SimpleForm());
request.getRequestDispatcher(VIEW_NAME).forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
final SimpleForm form = map(request);
if(form.getfName().equalsIgnoreCase("abc")){
request.setAttribute(MODEL_NAME, form);
// put additional attributes on the request
// e.g. validation errors,...
request.getRequestDispatcher(VIEW_NAME).forward(request, response);
}else{
System.out.println("No problem");
response.sendRedirect("/SuccessServlet");
}
}
private SimpleForm map(final HttpServletRequest request) {
SimpleForm form = new SimpleForm();
form.setfName(request.getParameter("fName"));
form.setlName(request.getParameter("lName"));
return form;
}
public static class SimpleForm implements Serializable {
private static final long serialVersionUID = -2756917543012439177L;
private String fName;
private String lName;
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
}
}
/WEB-INF/jsp/simpleForm.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<form method="POST">
First Name<input type="text" name="fName" value="${form.fName}"><br>
Last Name<input type="text" name="lName" value="${form.lName}">
<input type="submit" value="Send">
</form>
</body>
</html>
- GET / SimpleFormServlet
- 的doGet()准备的形式模型(SimpleForm),并增加了它作为名为“形式”的请求属性
- 转发到simpleForm.jsp
- 访问模型值和预填表格:$ {form.fName}和$ {} form.lName
- 浏览器仍显示/ SimpleFormServlet(我们喜欢它;-))
- POST形式相对到/ SimpleFormSerlvet(你没有明确设置表单元素的action属性)
- 的doPost()将请求映射参数到SimpleForm。
- 处理请求,做任何你想做的事情(验证)
- 然后您可以前进到simpleForm.jsp(当验证失败等),或重定向到另一个servlet(/ SuccessServlet例如)
我知道这是来不及回答,但这将是有益的人。 重定向是客户端操作,使我们不能的getAttribute值,但我们可以通过URL重写的概念解决这个问题。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub
String firstname=request.getParameter("fname");
if(firstname.equalsIgnoreCase("abc")){
//System.out.println("Setting attributes");
response.sendRedirect("MyFirstJSP.jsp?fname="+firstname+"&lname="+request.getParameter("lname")+"");
}
else{
System.out.Println("No problem");
}
}
然后使用的request.getParameter()以提取值作为MyFirstJSP.jsp字符串。
文章来源: Request Attributes not available in jsp page when using sendRedirect from a servlet