说明: 我对servlet中的doGet和doPost之间的关系有点偏执。
范围: 我正在构建一个工具来帮助我建立一个在线拍卖网站:
问题: Ajax页面似乎没有从doGet获取输出(实际上doGet似乎没有要提供的String,没有错误 - 只是像String =“”一样空白。这是直到业务逻辑方法添加到它之前。)
问题1: 如何使用doPost请求表单字符串'st',以便我可以调用业务方法,同时还可以重定向到html / js结果页面,也可以从Ajax调用doGet
问题2: 我一直试图通过阅读SO和其他网站来解决我的答案 - 但是想要正式提出而不是暗示:使用servlet是实现范围的最快方式(上面)?与JSP或任何其他Java服务器端库/框架相反?
hw / sw:CentOS 6.3,16gb ram,物理节点,corei7 @ 3.2,容器是tomcat 7
HTML
<html>
<head>
<title>URL Search Page</title>
</head>
<body>
<CENTER>
<FORM ACTION="/ResultServlet/Results" METHOD=GET>
<INPUT TYPE=TEXT NAME="st">
<INPUT TYPE=SUBMIT VALUE=Submit>
</FORM>
</CENTER>
</body>
</html>
的Servlet
@WebServlet("/Results")
public class Results extends HttpServlet {
private static final long serialVersionUID = 1L;
public static String str="";
public static void businessLogic(String q){
try {
str = new compute.URL.GetAvailURI( "https://www.registerdomains.com/auctionAPI/Key:a05u3***1F2r6Z&urlSearch="+q);
/*more boring number crunching */
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter printWriter = response.getWriter();
printWriter.println(str);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String st = request.getParameter("st");
businessLogic(st);
response.sendRedirect("results/resultActionURL.html");
}
}
答案 0 :(得分:2)
你形成方法的一个问题是,当你提交表单时,它将在servlet中运行doget方法,在你的情况下什么都不做。
所以首先将方法更改为post然后尝试运行,同时发布已编写ajax代码的html页面的代码。
我认为你是从ajax方法调用相同的servlet但是那时str中的值不会保留,所以在重定向到
时将所需数据作为查询字符串追加response.sendRedirect("results/resultActionURL.html?st="+ st);
您可以使用javascript
获得此值 function getParameterByName(name) {
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(window.location.search);
if (results == null)
return "";
else
return decodeURIComponent(results[1].replace(/\+/g, " "));
}
var st=getParameterByName(st);
//add your ajax call code and pass st as data there.
希望这能回答你的问题。
答案 1 :(得分:1)
通过执行此操作,您的应用程序是有状态的。您正在跨请求将数据存储在服务器中。
这意味着您的逻辑依赖于按顺序触发相同servlet对象的事实
首先,根本不需要这样做,您可以在从doPost本身作为参数或cookie值重定向期间将填充的String传递给浏览器。
即使你想这样做,也要在会话中存储这个String
request.getSession().setAttribute("str", populated string)
并在doGet方法中使用
检索它 request.getSession().getAttribute("str"
这比在servlet中有一个实例变量要好得多。
答案 2 :(得分:1)
一旦你重定向到其他页面servlet会破坏请求和响应对象和变量值...所以你不能得到旧的...所以尝试在重定向之前获取或将其保存在会话对象上... < / p>