关于servlet中@webservlet的参数设置及路径的疑惑

首先,编译了3个文件,为方便起见,按顺序分别记为A,B,C吧,其中A、c是servlet程序,B是普通java程序
之间的关系是:A调用B设置参数,A再转发给C响应,由C展现视图(表述不好,抱歉,书上说是控制器-模型-视图的一个流程)
编译生成的*.class文件均在WEB-INF/classes/me/get/feedmo目录下

HelloController.java内容如下:

package me.get.feedmo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*; //@WebServlet"/HelloController" //@WebServlet还需要其它设置吗,如果这样我这边会出错,所以一直都是配置的web.xml,麻烦不少
public class HelloController extends HttpServlet { private HelloModel model = new HelloModel; protected void doGetHttpServletRequest request, HttpServletResponse response throws ServletException, IOException { String name = request.getParameter"user"; String message = model.doHelloname; request.setAttribute"message", message; request.getRequestDispatcher"HelloView".forwardrequest, response; } protected void doPostHttpServletRequest request, HttpServletResponse response throws ServletException, IOException { this.doGetrequest, response; }
}

HelloModel.java内容如下:

package me.get.feedmo;
import java.util.HashMap; public class HelloModel { private HashMap<String, String> messages = new HashMap<String, String>; public HelloModel{ messages.put"one", "first"; messages.put"two", "second"; messages.put"three", "third"; } public String doHelloString user{ String message = messages.getuser; return message + "," + user + "!"; }
}

HelloView.java内容如下:

package me.get.feedmo; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; //@WebServlet"/HelloView"
public class HelloView extends HttpServlet { private static final long serialVersionUID = 1L; private String htmlTemplate = "<html>" + " <head>" + "<meta http-equiv=Content-Type" + "content=text/html; charset=UTF-8>" + "<title>%s</title>" + "</head>" + "<body>" + "<h1>%s</h1>" + "</body>" + "</html>"; protected void doGetHttpServletRequest request, HttpServletResponse response throws ServletException, IOException { String user = request.getParameter"user"; String message = Stringrequest.getAttribute"message"; String html = String.formathtmlTemplate, user, message; response.getWriter.printhtml; } protected void doPostHttpServletRequest request, HttpServletResponse response throws ServletException, IOException { this.doGetrequest, response; } }

WEB-INF的web.xml文件部分配置如下:

 <servlet> <servlet-name>HelloController</servlet-name> <servlet-class>me.get.feedmo.HelloController</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloController</servlet-name> <url-pattern>/do</url-pattern> //url设置为do </servlet-mapping> <servlet> <servlet-name>HelloView</servlet-name> <servlet-class>me.get.feedmo.HelloView</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloView</servlet-name> <url-pattern>/it</url-pattern> //url设置为it </servlet-mapping>

之后启动tomcat,浏览器地址栏输入(其中feedmo为tomcat的server.xml文件中的Context path)
http://localhost/feedmo/do提示404
http://localhost/feedmo/it页面就单单显示了null
这是什么原因呢,是不是文件在WEB-INF不可见的原因呢?
servlet这种问题估计大多数人都不愿意看的,真不是故意的。。
能看到这里真的很谢谢各位啦,望多多指教!:D


是自己对getRequestDispatcher认识生疏的问题,参数应该传入的是对应的url字符串,而不应该是servlet。所以现在访问:
http://localhost/feedmo/do?user=one
就可以得到first,one!的结果。
谢谢好心哥哥们的帮助:P

同样很久没看过原生的Servlet了……

Q:@WebServlet还需要其它设置吗,如果这样我这边会出错,所以一直都是配置的web.xml,麻烦不少

A:@WebServlet是Servlet 3.0的注解,需要相应的tomcat版本支持。你说的@WebServlet报错,具体是报了什么错呢?感觉你这里写的@WebServlet是有问题的,可以看一下这里;

Q:http://localhost/feedmo/do 提示404

A:报404是因为你代码里实现了请求转发,而你看一下getRequestDispatcher参数里的形参名称就知道,这里应该传入一个url字符串,而不是servlet的名称,你这里的代码实现相当于当输入http://localhost/feedmo/do时,后端将请求转发至http://localhost/feedmo/do/HelloView,所以报404;

Q:http://localhost/feedmo/it 页面就单单显示了null

A:你的GET请求没有带上url参数和属性,所以HelloView#doGet里的usernull,而这一句String message = Stringrequest.getAttribute"message";感觉应该会抛出NPE异常,因为request.getAttribute"message"应该为null,对null进行强制转型会触发NPE异常。假设没有触发NPE异常,messagenull,则把usermessage填充至html模板里,就会变成以下代码:

<html> <head> <meta http-equiv=Content-Type content=text/html; charset=UTF-8> <title>null</title> </head> <body> <h1>null</h1> </body>
</html>

所以,页面上的输出应该就是一个大写的

null

而且浏览器的标签页标题也是显示null

因为已经很久没有写野生的servlet的代码了,我看了下说下我大致的想法

  1. http://localhost/feedmo/it这个页面显示为null,会不会是因为没有调用out.flush呢?后者说writer在写完以后是不是需要close呢?

  2. http://localhost/feedmo/do页面404的原因会不会是因为request.getRequestDispatcher"HelloView"需要把这个改为request.getRequestDispatcher"/feedmo/it"呢?

  3. 加上@WebServlet注解是直接报编译错误,还是运行时会报错?

发表评论

电子邮件地址不会被公开。 必填项已用*标注