首先,编译了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 doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("user");
String message = model.doHello(name);
request.setAttribute("message", message);
request.getRequestDispatcher("HelloView").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, 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 doHello(String user){
String message = messages.get(user);
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 doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String user = request.getParameter("user");
String message = (String)request.getAttribute("message");
String html = String.format(htmlTemplate, user, message);
response.getWriter().print(html);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, 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
Cela faisait aussi longtemps que je n'avais pas vu de Servlet natif...
A :
;@WebServlet
est une annotation pour Servlet 3.0 et doit être prise en charge par la version Tomcat correspondante. Vous avez dit que@WebServlet
avait signalé une erreur. Quelle erreur spécifique avez-vous signalée ? J'ai l'impression qu'il y a quelque chose qui ne va pas avec le@WebServlet
que vous avez écrit ici. Vous pouvez jeter un oeil iciA : La raison pour laquelle vous avez signalé 404 est que votre code a implémenté le redirection de demande, et vous pouvez savoir en regardant le nom du paramètre formel dans le paramètre
;getRequestDispatcher
qu'une chaîneurl
doit être transmis ici. Au lieu du nomservlet
, votre implémentation de code ici équivaut à lors de la saisie dehttp://localhost/feedmo/do
, le backend transmet la demande àhttp://localhost/feedmo/do/HelloView
, donc 404 est signaléA : Votre requête GET ne contient pas de paramètres ni d'attributs d'URL, donc le
HelloView#doGet
dansuser
estnull
, et cette phraseString message = (String)request.getAttribute("message");
donne l'impression qu'elle devrait lever une exception NPE, carrequest.getAttribute("message")
devrait Pournull
, la conversion forcée denull
déclenchera une exception NPE. En supposant qu'aucune exception NPE n'est déclenchée et quemessage
estnull
, alors rempliruser
etmessage
dans le modèle html deviendra le code suivant :Donc, le résultat sur la page doit être en majuscule
nul
Et le titre de l'onglet du navigateur s'affiche également
null
.Comme je n'ai pas écrit de code de servlet sauvage depuis longtemps, j'ai jeté un coup d'œil et partagé mes réflexions générales
.http://localhost/feedmo/it
Cette page s'affiche commenull
. Serait-ce parce queout.flush()
n'a pas été appelé ? Ce dernier a dit siwriter
est nécessaire après avoir fini d'écrireclose
La raison de la page 404 pourrait-elle être que
http://localhost/feedmo/do
doit être remplacé parrequest.getRequestDispatcher("HelloView")
?request.getRequestDispatcher("/feedmo/it")
signalera directement une erreur de compilation, ou une erreur sera-t-elle signalée lors de l'exécution
?@WebServlet