繁体   English   中英

如何在Servlet doPOst上使用JSP?

[英]How to use JSP on Servlet doPOst?

我刚开始使用JSP和Servlet,并且正在尝试为设备创建控制器。 一个带有4个按钮的简单页面。 每次单击其中一个按钮时,用户应看到显示的内容(根据所按下的按钮)。 我正在尝试通过使用Servlet和JSP来做到这一点。 我不确定这是否是一个好方法,但是问题是我做得不好,因为当我运行我的应用程序时,我可以看到4个按钮,但是单击它们却什么也没有发生。 我做错了什么? 对于其他方法,我将提出一些建议。

MainServlet

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CheckTemperature
 */
@WebServlet("/CheckTemperature")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    /**
     * @see HttpServlet#HttpServlet()
     */
    public MainServlet() {
        super();      
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Check tempetaure</title></head>");
        out.println("<body>");
        out.println("<input type=\"submit\" value=\"Check temperature\" name=\"button\"/>");
        out.println("<input type=\"submit\" value=\"Get AC state\" name=\"button\"/>");
        out.println("<input type=\"submit\" value=\"Turn ON AC\" name=\"button\"/>");
        out.println("<input type=\"submit\" value=\"Turn OFF AC\" name=\"button\"/>");
        out.println("</body>");
        out.println("</html>");     
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String button = request.getParameter("button");
        if(button.equalsIgnoreCase("Check temperature")){
            request.getRequestDispatcher("/WEB-INF/jsps/checkTemperature.jsp").include(request, response);
        } else if(button.equalsIgnoreCase("Get AC state")){
            request.getRequestDispatcher("/WEB-INF/jsps/acState.jsp").include(request, response);
        } else if(button.equalsIgnoreCase("Turn ON AC")){
            request.getRequestDispatcher("/WEB-INF/jsps/turnOn.jsp").include(request, response);
        } else if(button.equalsIgnoreCase("Turn OFF AC")){
            request.getRequestDispatcher("/WEB-INF/jsps/turnOff.jsp").include(request, response);
        }           
    }    
}

web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ArduinoController</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>ACController</display-name>
    <servlet-name>MainServlet</servlet-name>
    <servlet-class>ro.dnad.controller.MainServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/main</url-pattern>
  </servlet-mapping>
</web-app>

checkTemperature.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="ro.dnad.controller.EthernetACDriver" %>

<%EthernetACDriver driver = new EthernetACDriver("localhost",8080); %>
<%double temp = driver.getTemperature() * 5; %>
<%=temp%>

acState.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="ro.dnad.controller.EthernetACDriver" %>

<%EthernetACDriver driver = new EthernetACDriver("localhost",8080); %>
<%=driver.ACStatus()%>

turnOff.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="ro.dnad.controller.EthernetACDriver" %>

<%EthernetACDriver driver = new EthernetACDriver("localhost",8080); %>
<%driver.sendMessage(3); %>
<%=driver.ACStatus()%>

turnOfn.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="ro.dnad.controller.EthernetACDriver" %>

<%EthernetACDriver driver = new EthernetACDriver("localhost",8080); %>
<%driver.sendMessage(2); %>
<%=driver.ACStatus()%>
  • 首先,应该使用JSP而不是使用servlet创建动态内容。
  • 为了处理您的代码,您需要添加每个提交,但要在表单内部。 然后只有提交按钮将起作用。

代码示例:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Check tempetaure</title></head>");
        out.println("<body>");
        out.println("<form action='CheckTemperature' method='post'>");

        out.println("<input type=\"submit\" value=\"Check temperature\" name=\"button\"/>");
        out.println("<form />");
        out.println("<input type=\"submit\" value=\"Get AC state\" name=\"button\"/>");
        out.println("<input type=\"submit\" value=\"Turn ON AC\" name=\"button\"/>");
        out.println("<input type=\"submit\" value=\"Turn OFF AC\" name=\"button\"/>");
        out.println("</body>");
        out.println("</html>");     
    }

当我运行我的应用程序时,我可以看到4个按钮,但是单击它们不会发生任何反应

因为您没有提供要执行的任何操作,也没有提供按钮在表单内部的信息。

另外,您已经两次映射了Servlet

  1. 使用@WebServlet("/CheckTemperature")
  2. 并在web.xml中使用url-pattern ,选择一个。

你以旧的方式学习,即

  • 避免使用scriptlets(<% %>, <%= %>)而不要使用JSTL或其他标记库。

  • 与其在jsp中编写Java代码,不如使用Model/Service类将业务逻辑与视图分开。 那么您可以轻松地调试代码,而无需使用jsp。

  • 不要在servlet中使用硬代码生成html代码。 而是创建一个静态HTML/jsp页面,使用form是将action值指定为Servlet url-pattern,将方法类型指定为GET/POST ,然后在填写详细信息后提交from,在Servlet中处理该表单,最后将响应转发至jsp/html页。


解:

Servlet的:

/**
* Servlet implementation class CheckTemperature
*/
@WebServlet("/CheckTemperature")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

  /**
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      PrintWriter out = response.getWriter();
      String button = request.getParameter("button");

      EthernetACDriver driver = new EthernetACDriver("localhost",8080);

      if(button.equalsIgnoreCase("Check temperature")){
         double temp = driver.getTemperature() * 5;
         request.setAttribute("temp", temp);// add temperature value to request
         RequestDispatcher dispatcher =
                 request.getRequestDispatcher("/WEB-INF/jsps/checkTemperature.jsp");
         dispatcher.forward(request,response);
      } else if(button.equalsIgnoreCase("Get AC state")){
         request.setAttribute("acStatus", driver.ACStatus()); // add AC status value to request
         RequestDispatcher dispatcher =
                 request.getRequestDispatcher("/WEB-INF/jsps/acState.jsp");          
         dispatcher.forward(request,response);
      } else if(button.equalsIgnoreCase("Turn ON AC")){
         driver.sendMessage(3);
         request.setAttribute("acTurnOnMsg", driver.ACStatus());// add AC turn on status value to request        
         RequestDispatcher dispatcher =
                 request.getRequestDispatcher("/WEB-INF/jsps/turnOn.jsp");                
         dispatcher.forward(request,response);
      } else if(button.equalsIgnoreCase("Turn OFF AC")){
         driver.sendMessage(3);
         request.setAttribute("acTurnOffMsg", driver.ACStatus()); //AC turn off status value to request
         RequestDispatcher dispatcher =
                 request.getRequestDispatcher("/WEB-INF/jsps/turnOff.jsp");      
         dispatcher.forward(request,response);
      }           
  }    
}

在JSP中使用如下表达式:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

在jsp的顶部。

然后

checkTemperature.jsp:

${temp} //从请求中获取温度值。

acState.jsp:

${acStatus} //从请求中获取AC状态值

turnOff.jsp:

${acTurnOnMsg} //从请求中获取AC开启状态值

turnOfn.jsp:

${acTurnOffMsg} //从请求中获取AC开启状态值

编辑: JSP:

<c:url value="/CheckTemperature" var="postUrl"/>
<form action="${postUrl}" method="POST">
    <input type="submit" value="Check temperature" name="button"/>
    <input type="submit" value="Get AC state" name="button"/>
    <input type="submit" value="Turn ON AC" name="button"/>
    <input type="submit" value="Turn OFF AC" name="button"/>
</form>

在这里获取JSTL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM