Servlet doGet,doPost和Ajax

时间:2013-01-16 04:17:40

标签: java servlets

说明: 我对servlet中的doGet和doPost之间的关系有点偏执。

范围: 我正在构建一个工具来帮助我建立一个在线拍卖网站:

  1. 我(用户)在表单(html页面)中输入名称,此名称将是一个URL(可能用于销售 - >业务方法通过API确定此信息)
  2. html表单在doPost中发布表单名称,然后doPost使用表单名称作为参数来调用业务方法
  3. 在调用业务方法之后,我重定向到结果html / js页面,该页面使用Ajax调用doGet方法来获取相关的输出(在业务逻辑方法中填充的公共类String)
  4. 问题: 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");
    
        }
    
    }
    

3 个答案:

答案 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对象的事实

  1. 发布请求 - 调用业务方法并填充字符串
  2. 获取请求 - 尝试检索上次请求中填充的字符串。
  3. 首先,根本不需要这样做,您可以在从doPost本身作为参数或cookie值重定向期间将填充的String传递给浏览器。

    即使你想这样做,也要在会话中存储这个String request.getSession().setAttribute("str", populated string)

    并在doGet方法中使用

    检索它

    request.getSession().getAttribute("str"

    这比在servlet中有一个实例变量要好得多。

答案 2 :(得分:1)

一旦你重定向到其他页面servlet会破坏请求和响应对象和变量值...所以你不能得到旧的...所以尝试在重定向之前获取或将其保存在会话对象上... < / p>