web开发中,servlet和jsp之间传值的方法?
参考答案
情况1
如果使用servlet请求转发到jsp,建议使用request域传值:
servlet:
public void service(HttpServletRequest req, HttpServletResponse resp) {
...
req.setAttribute("name", "王五");
req.getRequestDispatcher("/target.jsp").forward(req,resp);
}
jsp:
<html>
<body>
${requestScope.name}
</body>
</html>
情况2
如果servlet间使用重定向,可以利用session传值:
servlet:
public void service(HttpServletRequest req, HttpServletResponse resp) {
...
session.setAttribute("name", "王五");
resp.sendRedirect("/app/target");
}
target servlet:
public void service(HttpServletRequest req, HttpServletResponse resp) {
// 获取并移除,session域中的变量要保证其时效尽可能短
String name = (String)session.getAttribute("name");
session.removeAttribute("name");
...
}
以上办法的局限性是重定向到站外地址时就不能用session了,不过还可以用重定向请求参数传值:
servlet:
public void service(HttpServletRequest req, HttpServletResponse resp) {
...
// 请求参数需要使用URL编码
String encoded = URLEncoder.encode("王五", "utf-8");
resp.sendRedirect("/app/target?name="+encoded);
}
target servlet:
public void service(HttpServletRequest req, HttpServletResponse resp) {
// 请求参数还原(也可以在web服务器中设置)
String name = request.getParameter("name");
String decoded = URLDecoder.decode(name, "utf-8");
...
}
情况3
最后一种办法就是让参数值以cookie的方式存入客户端,适用于对安全要求不高的数据:
save cookie servlet:
public void service(HttpServletRequest req, HttpServletResponse resp) {
// cookie中文参数也需要使用URL编码
String encoded = URLEncoder.encode("王五", "utf-8");
Cookie cookie = new Cookie("name", encoded);
// 增强cookie的安全性,禁用js访问cookie
cookie.setHttpOnly(true);
resp.addCookie(cookie);
...
}
use cookie servlet:
public void service(HttpServletRequest req, HttpServletResponse resp) {
Cookie[] cs = req.getCookies();
for(Cookie cookie: cs) {
if(cookie.getName().equals("name") {
String decoded = URLDecoder.decode(cookie.getValue(), "utf-8");
...
}
}
}