jsp / servlet页面有问题

时间:2010-12-06 17:23:49

标签: java jsp servlets

我想创建一个简单的JSP页面。我有一个EJB,在这里有一个会话bean。 我有一个JSP页面和一个Servlet,但我有一个奇怪的情况。

当我点击我的页面上的执行时,这将变为白页并且不会给我结果。 我在这里发布我的代码,请你帮我。

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>

1 个答案:

答案 0 :(得分:2)

当您使用旧式 scriptlet (那些<% %>事物)并且其中一个 scriptlet 在响应时抛出异常时,JSP将会消隐已经承诺了。显示错误页面为时已晚。浏览器以半页HTML页面结束(JSP生成的HTML不完整,浏览器通常为空白)。您应该阅读服务器日志以获取异常并相应地修复代码。


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

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

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

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

request.setAttribute("result", result);

并通过EL访问它,如下所示,它只能通过名称即时访问页面/请求/会话/应用程序作用域属性:

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

相关问题: