【问题标题】:Problem with jsp/servlet pagejsp/servlet 页面的问题
【发布时间】:2010-12-06 17:23:48
【问题描述】:

我想创建一个简单的 JSP 页面。我有一个 EJB,其中有一个会话 bean。 我有一个 JSP 页面和一个 Servlet,但我遇到了一个奇怪的情况。

当我在我的页面上单击执行时,这会变成一个白页并且不给我结果。 我在这里发布我的代码,请您帮帮我。

小服务程序:

package web;

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

import java.io.IOException;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.*;
import javax.servlet.http.*;

import ejb.calc;
/**
 * Servlet implementation class calcServlet
 */
public class calcServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public calcServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  HttpSession session=request.getSession(true); 
  RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/index.jsp"); 

  float a=Float.parseFloat(request.getParameter("n1"));
  float b=Float.parseFloat(request.getParameter("n2"));
  char oper=request.getParameter("oper").charAt(0);
  float result=0;

  try {
   Context ctx=new InitialContext();
  // call the calcImpl class of the SimpleCalculator EJB with the mappedName
   calc cl=(calc) ctx.lookup("Firstcalc");
   switch(oper){

   case '+': result=cl.sum(a, b); break;

   case '-': result =cl.minus(a, b); break;

   case '*': result =cl.mult(a, b); break;

   case '/': result =cl.div(a, b); break;
  }
   session.setAttribute("result",result);
   request.setAttribute("a", a);

   request.setAttribute("b", b);
  }
  catch(NamingException e)
  {session.setAttribute("erreur: ",e.getMessage());
  }rd.forward(request,response);
 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
 }

}

JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <h2> <b> Hello World To The Simple Calculator </b> </h2> <% float a=2,b=1; if (request.getAttribute("a")!=null) a=Float.parseFloat(request.getAttribute("a").toString()); if( request.getAttribute("b")!=null) b=Float.parseFloat(request.getAttribute("b").toString()); %> <form method="post" action="calcServlet"> <b>Number 1:</b><input type='text' name='n1' value="<%=a%>" /> <br/>
    <b>Number 2:</b><input type='text' name='n2' value="<%=b%>" /> <br/>
    <u><b>Options:</b></u> <br/>
    <ul>
    <li><b>+</b><input type='radio' name="oper" value='+' checked /></li>
    <li><b>&nbsp;-</b><input type='radio' name="oper" value='-' /></li>
    <li><b>*</b><input type='radio' name="oper" value='*' /></li>
    <li>&nbsp; <b>/</b><input type='radio' name="oper" value='/' /></li> </ul>
    <b>-------------------------------------------</b> <br/>
    <input type="submit" value="Executer" /> </form>
    <font color='blue'><b>Result is: </b> <%=session.getAttribute("result")%> </font> <br/> <font color='red' >Error: <%=session.getAttribute("error")%></font>
    </body>
    </html>

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    当您使用老式的scriptlet(那些&lt;% %&gt; 的东西)时,JSP 将空白,并且其中一个 scriptlet 在响应已经抛出时抛出了异常被承诺。显示错误页面为时已晚。浏览器最终得到一个半生不熟的 HTML 页面(JSP 生成的 HTML 不完整,浏览器通常会变为空白)。您应该阅读服务器日志以了解异常并相应地修复代码。


    与实际问题无关,您的方法非常笨拙。你根本不需要 scriptlets。只需使用 EL(那些${} 的东西)。它可以即时访问请求参数。例如

    <input type="text" name="n1" value="${param.n1}" />
    

    (对于额外的课程点:使用 JSTL fn:escapeXml() 防止 XSS)

    您甚至不需要将它们复制为 servlet 中的请求属性。您也不应该将结果存储为会话属性(它将在同一会话中的所有浏览器窗口/选项卡之间共享,您不希望将其用于基于请求的变量)。将其存储为请求属性

    request.setAttribute("result", result);
    

    并通过 EL 访问它,如下所示,它可以通过其名称即时访问页面/请求/会话/应用程序范围的属性:

    <b>Result is: </b> ${result}
    

    相关问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-28
      • 2013-11-25
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多