Kor*_*gay 0 java jsp servlets post-redirect-get java-ee
我想做一个简单的post-redirect - 使用JSP.这就是我做到的.重要的Servlet是这样的:
public class PostRedirectGet extends HttpServlet {
public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
throws ServletException, IOException {
getServletContext().getRequestDispatcher("/WEB-INF/getInformation.jsp")
.forward(httpServletRequest,httpServletResponse);
}
public void doPost(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)
throws IOException {
String firstName = httpServletRequest.getParameter("firstName");
HttpSession httpSession = httpServletRequest.getSession();
httpSession.setAttribute("firstName",firstName);
httpServletResponse.sendRedirect(getServletContext().getContextPath()+"/getFormData");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当对此Servlet(/ index)发出get请求时,我只显示表单所在的getInformation.jsp.
表单对同一个url(/ index)发出post请求,这次调用doPost.在这里我保持firstName如下所示:
String firstName = httpServletRequest.getParameter("firstName");
Run Code Online (Sandbox Code Playgroud)
然后我将用户重定向到/ getFormData.这是负责任的servlet:
public class Get extends HttpServlet {
public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
throws ServletException, IOException {
String firstName = (String) httpServletRequest.getSession().getAttribute("firstName");
httpServletRequest.setAttribute("firstName",firstName);
getServletContext().getRequestDispatcher("/WEB-INF/showInformation.jsp")
.forward(httpServletRequest, httpServletResponse);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我在这里得到变量
String firstName = (String) httpServletRequest.getSession().getAttribute("firstName");
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是:1)这样firstName将在整个会话期间可用,但我不想要这个.那么我应该如何在两个servlet之间传递信息呢?或者我应该如何清除这个值?
然后我将请求转发给showInformation.jsp,它看起来像:
Hello, your first name is: <%= request.getAttribute("firstName") %>
Run Code Online (Sandbox Code Playgroud)
我的第二个问题是:2)为什么没有";" 后request.getAttribute("名字)?在这里它工作正常,像这样的,但我希望是一个分号(";")是必要的.
如果我放一个分号,我在我的jsp文件中得到这个异常:
Syntax error on token ";", delete this token
Run Code Online (Sandbox Code Playgroud)
关于你的第一个问题:你不应该使用会话来存储这样的临时数据.
让我们来看一个更现实的例子.表单用于创建产品.POST请求包含产品的所有信息.因此,servlet从请求参数中获取此信息,在数据库的product表中创建一行,并为此创建的产品生成标识符(主键).现在,servlet应该重定向到显示已创建产品信息的页面.所以它应该重定向到这种URL:
/product?id=<theGeneratedProductId>
Run Code Online (Sandbox Code Playgroud)
要么
/products/<theGeneratedProductId>
Run Code Online (Sandbox Code Playgroud)
然后,第二个servlet将从请求参数或请求URL获取产品的ID,从数据库获取产品信息,将Product对象存储在请求属性中,并转发到显示此产品的JSP.
关于你的第二个问题:
<%= request.getAttribute("firstName") %>
Run Code Online (Sandbox Code Playgroud)
由JSP编译器翻译成以下Java指令(这不完全正确,但您应该明白这一点):
response.getWriter().print(request.getAttribute("firstName"));
Run Code Online (Sandbox Code Playgroud)
所以你明白添加分号会转化为
response.getWriter().print(request.getAttribute("firstName"););
Run Code Online (Sandbox Code Playgroud)
这将是无效的Java代码.
不管怎样,你不应该在JSP中使用scriptlet.因此,请尽量忘记存在scriptlet,并学习JSP EL,JSTL和其他自定义标记库.你应该写:
${firstName}
Run Code Online (Sandbox Code Playgroud)
或者,甚至更好:
<c:out value="${firstName}"/>
Run Code Online (Sandbox Code Playgroud)
这将确保你的HTML保持有效即使的firstName恰好包含必须HTML字符转义,如<,>,&,'或".
想想如果用户提交了以下firstName会发生什么,以及它是否未正确转义:
<script>alert('Got you!');</script>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8376 次 |
| 最近记录: |