运行项目时,我收到此“此URL不支持HTTP方法POST”错误。有趣的是,两天前它运行得非常好。我对我的代码进行了一些更改后,然后恢复了我的原始代码,并给了我这个错误。你能帮我吗?
这是我的index.html:
<form method="post" action="login.do">
<div>
<table>
<tr><td>Username: </td><td><input type="text" name="e_name"/>
</td> </tr>
<tr><td> Password: </td><td><input type="password" name="e_pass"/>
</td> </tr>
<tr><td></td><td><input type="submit" name ="e_submit" value="Submit"/>
这是我的登录servlet:
public class Login extends HttpServlet {
/**
* Processes requests for both HTTP
* <code>GET</code> and
* <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
/*
* TODO output your page here. You may use following sample code.
*/
int status;
String submit = request.getParameter("e_submit");
String submit2 = request.getParameter("a_submit");
out.println("Here1");
String e_name = request.getParameter("e_name");
String e_password = request.getParameter("e_pass");
String a_name = request.getParameter("a_name");
String a_password = request.getParameter("a_pass");
out.println(e_name+e_password+a_name+a_password);
Author author = new Author(a_name,a_password);
Editor editor = new Editor(e_name,e_password);
// If it is an AUTHOR login:
if(submit==null){
status = author.login(author);
out.println("Author Login");
//Incorrect login details
if(status==0) {
out.println("Incorrect");
RequestDispatcher view = request.getRequestDispatcher("index_F.html");
view.forward(request, response);
}
//Correct login details --- AUTHOR
else {
out.println("Correct login details");
HttpSession session = request.getSession();
session.setAttribute(a_name, "a_name");
RequestDispatcher view = request.getRequestDispatcher("index_S.jsp");
view.forward(request, response);
}
}
//If it is an EDITOR login
else if (submit2==null){
status = editor.login(editor);
//Incorrect login details
if(status==0) {
RequestDispatcher view = request.getRequestDispatcher("index_F.html");
view.forward(request, response);
}
//Correct login details --- EDITOR
else {
out.println("correct");
HttpSession session = request.getSession();
session.setAttribute(e_name, "e_name");
session.setAttribute(e_password, "e_pass");
RequestDispatcher view = request.getRequestDispatcher("index_S_1.html");
view.forward(request, response);
} }
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}}
我的web.xml看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>controller.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
我使用Glassfish v3服务器 - 让我知道您需要知道的任何其他内容
答案 0 :(得分:4)
那是因为在您的doGet()
和doPost()
方法中,您正在调用它的super
方法。而是在上面提到的相应方法中调用processRequest()
。
super.doGet()
和super.doPost()
方法默认返回HTTP 405,因此您不会调用超类doGet()
和doPost()
。
答案 1 :(得分:2)
为什么代码中有processRequest
方法?谁会称这种方法?
通过致电super.doGet()
或super.doPost()
,您无法达到该方法
你需要明确地调用那个方法。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
processRequest(req,resp)
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
processRequest(req,resp)
}
修改强>
这样做
response.sendRedirect("index_F.html");
return;
而不是
RequestDispatcher view = request.getRequestDispatcher("index_F.html");
view.forward(request, response);
答案 2 :(得分:0)
在doPost()
内,你必须致电processRequest()
。
答案 3 :(得分:0)
您在没有实际实施(使用doGet()
)的情况下调用doPost()
和super
方法。
HttpServlet基本上遵循模板方法模式,其中所有未重写的HTTP方法都返回HTTP 405
错误“Method not supported”。当您覆盖此类方法时,不应调用super
方法,否则您仍会收到HTTP 405
错误。你的doPost()方法也是如此。
在上述相应方法中调用processRequest(req,resp)
。
编辑:
其次,
不要使用调度程序将请求转发给HTML。如果你只想显示html,请使用重定向。
response.sendRedirect("index_F.html");
return;
此外,最好在执行注销时使用redirect
或发回无效凭据。