此url不支持405 http方法get

时间:2011-04-18 09:24:14

标签: java servlets java-ee

我已经编写了一个用于批准叶子的servlet。在这个servlet中,我还编写了发送邮件的代码。因此,它显示HTTP 405错误。如果我删除发送邮件的代码,那么它不会显示错误,但我需要邮件代码。

package mis;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.jdo.PersistenceManager;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import javax.jdo.Query;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class approve extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws IOException {

        try{



             HttpSession session = req.getSession(true);        

            PersistenceManager pm1 = PMF.get().getPersistenceManager();
         Query query1 = pm1.newQuery(Leave_bal.class);
         query1.setFilter("emp_Id == emp");
         query1.declareParameters("String emp");
         List<Leave_bal> results1 = (List<Leave_bal>)query1.execute(session.getAttribute("emp_Id").toString());

         String plan="";
         String unplan="";

         String planleave_result="" ;
         String unplanleave_result="";


         for (Leave_bal e : results1) 
         {
          plan=e.getplan_leave();
          resp.getWriter().println("Planned_Leave"+plan);

          unplan=e.getunplan_leave();
          resp.getWriter().println("Unplanned:"+unplan);
         }

        int plan_leave=Integer.parseInt(plan);
         int unplan_leave=Integer.parseInt(unplan);


       String ID=req.getParameter("id");
        resp.getWriter().println(ID);
        PersistenceManager pm = PMF.get().getPersistenceManager();
        Query query = pm.newQuery(Leave_detail.class);
     query.setFilter("id == ID");
     query.declareParameters("String ID");       
     List<Leave_detail> results = (List<Leave_detail>)query.execute(ID);

     String plan_detail="";


     String duration="";
     for (Leave_detail e : results) 
     {
     plan_detail=e.getLeave_Type();
     duration=e.getdurtn();
     //f=e.getfrom();
    //t=e.getto();
     }

     resp.getWriter().println("duration "+duration);
     resp.getWriter().println("Planned_selected "+plan_detail);


         int duration_integer=Integer.parseInt(duration);
         resp.getWriter().println("duration "+duration_integer);


        //String duration=req.getParameter("date");
       // resp.getWriter().println("diffrence:"+duration);
        //int workingdays=Integer.parseInt(duration);                                            

        //String Leave = req.getParameter("a"); 
       // resp.getWriter().println("planned:"+Leave);

        if(plan_detail.equals("UNPLAN"))
        {                           
            unplan_leave=unplan_leave-duration_integer;
            unplanleave_result=String.valueOf(unplan_leave);
            planleave_result=plan;
        resp.getWriter().println("Planned After Change"+unplanleave_result);
            //st="Applied";

        }
        if(plan_detail.equals("PLAN"))
        {
            plan_leave= plan_leave-duration_integer;
            planleave_result=String.valueOf(plan_leave);
         resp.getWriter().println("Planned After Change"+planleave_result);
             unplanleave_result=unplan;

        }

        if(plan_detail.equals("LWP"))
        {
            plan_leave= plan_leave-duration_integer;
            planleave_result=String.valueOf(plan_leave);
             resp.getWriter().println("Planned After Change"+planleave_result);
             unplanleave_result=unplan;

        }

        if(plan_detail.equals("Onduty"))
        {
            planleave_result=plan;
             unplanleave_result=unplan;

        }




        Leave_detail status_update = pm.getObjectById(Leave_detail.class,ID);
        status_update.setstatus("Approved");
        pm.makePersistent(status_update); 

         Leave_bal ed1=new Leave_bal(session.getAttribute("emp_Id").toString(),planleave_result,unplanleave_result);

         pm.makePersistent(ed1);



//code for mail

        RequestDispatcher dispatcher = getServletConfig ( ) .getServletContext ().getRequestDispatcher("/MailServiceapply");         
         dispatcher.forward (req, resp) ;   

    pm.close();
    }
          catch(Exception a )
            {
                 resp.getWriter().println(a .getMessage());
            } finally{

            }
            resp.sendRedirect("hr.jsp#LMS");        
        }
}

2 个答案:

答案 0 :(得分:1)

Java论坛上的

This thread提供了一些关于此错误的提示,例如

  • HTML表单调用POST操作,servlet未实现doPostdirect link
  • 未在web.xml文件中声明的初始HTML表单(或拼写错误)(direct link

答案 1 :(得分:1)

在这个servlet的底部,你将请求转发给另一个servlet:

RequestDispatcher dispatcher = getServletConfig().getServletContext().getRequestDispatcher("/MailServiceapply");
dispatcher.forward(req, resp);

这不仅是一种糟糕的方法,当然是因为你之前在servlet中已经将数据写入了HTTP响应,因此你会冒IllegalStateException的风险(写入响应应该发生在JSP中),但这样做所以也要求有问题的servlet也实现doGet()。您遇到的错误表明此邮件服务servlet仅实现了doPost()

您需要向邮件服务servlet添加doGet()方法,并使用RequestDispatcher#include()来调用它。

dispatcher.include(req, resp);

毋庸置疑,这仍然是一种糟糕的做法。您更愿意将邮件代码逻辑重构为独立的Java类,然后在两个servlet中导入和调用它们,并将所有表示逻辑放在JSP中。