【发布时间】:2015-10-30 12:55:06
【问题描述】:
尝试以编程方式运行 Web 应用程序。编写了将自动部署 Web 应用程序的代码。部署 Web 应用程序后,我使用 URL 类调用带有一些输入的 servlet 并打印响应,如下所示。
//code to start Tomcat server and deploy the web app
String myUrl = "http://localhost:8080/CrossSiteScripting?user=shri&passwd=firstPassword";
URL url = new URL(myUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
String httpMethod = con.getRequestMethod();
while((inputLine=in.readLine()) != null){
response.append(inputLine);
}
in.close();
System.out.println("\n----------------------\nHTTP Method : "+ httpMethod +"\nOutput: "+response.toString());
我正在调用 servlet 的 doGet() 方法。 doGet 方法内的代码如下所示。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String user = request.getParameter("user");
String pwd = request.getParameter("passwd");
request.setAttribute("user", user);
request.setAttribute("passwd", pwd);
PrintWriter pw = response.getWriter();
pw.write("Inside doGet method of Servlet\nuser name: "+user+"password= "+pwd);
RequestDispatcher view = request.getRequestDispatcher("homePage.jsp");
view.forward(request, response);
}
如果我注释掉 doget 方法中的最后一行 view.forward(request, response);,那么我就能得到预期的响应。但如果它没有被评论,那么我得到NullPointerException 并且服务器返回HTTP 响应代码500。
这是我在使用 URL 类运行应用程序时遇到的错误。
asAug 07, 2015 11:53:47 AM org.apache.catalina.core.StandardContext setPath
WARNING: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []
C:\Users\IBM_ADMIN\workspace\Initiate Tomcat\.
Host: StandardEngine[Tomcat].StandardHost[localhost]
starting server...
Aug 07, 2015 11:53:47 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Aug 07, 2015 11:53:47 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Aug 07, 2015 11:53:47 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Aug 07, 2015 11:53:47 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.23
Aug 07, 2015 11:53:48 AM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [173] milliseconds.
Aug 07, 2015 11:53:48 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
started.
Initiating URL: http://localhost:8080/CrossSiteScripting?user=shri&user=manoj&user=shrikant&passwd=firstPassword&passwd=admino
Aug 07, 2015 11:53:48 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [CrossSiteScripting] in context with path [/] threw exception
java.lang.NullPointerException
at penetration.testing.CrossSiteScripting.doGet(CrossSiteScripting.java:41)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1177)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:857)
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/CrossSiteScripting?user=shri&user=manoj&user=shrikant&passwd=firstPassword&passwd=admino
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1638)
at main.java.launch.Main.main(Main.java:92)
由于view.forward() 方法,最后一行可能会抛出异常。哪个将控件转发给JSP. 有没有其他方法可以做到这一点?我希望该 JSP 页面能够像在浏览器中打开时那样执行。
这是目录结构:
+InitiateTomcat
|-- +src
|---|- +main.java.launch
|---|--- main.java //the main class from where I start Tomcat server and deploy a web application
|---|- +penetration.testing
|---|--- CrossSitrScripting.java // the servlet which am calling
|-- +WebContent
+WEB-INF
homePage.jsp // the homepage
【问题讨论】:
-
@Javy @Garry :我尝试将其更改为
/homepage.jsp,但它不起作用。得到同样的错误。 -
@Javy 错误是因为最后一行
view.forward.因为我尝试在没有该行的情况下运行它并且它成功执行。
标签: java tomcat servlets web-applications