首先,编译了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
나도 네이티브 서블릿을 본지 꽤 됐는데...
A:
에서 확인해 보세요.@WebServlet
은 Servlet 3.0용 주석이며 해당 tomcat 버전에서 지원되어야 합니다.@WebServlet
이(가) 오류를 보고했다고 하셨습니다. 구체적으로 어떤 오류를 보고하셨나요? 여기에 작성하신@WebServlet
에 문제가 있는 것 같습니다.A: 404를 보고하는 이유는 코드가 요청 전달을 구현했기 때문입니다.
A: GET 요청은 URL 매개변수와 속성을 전달하지 않으므로getRequestDispatcher
매개변수의 형식 매개변수 이름을 보면url
문자열이 다음과 같아야 함을 알 수 있습니다. 여기에 전달된 이름servlet
은http://localhost/feedmo/do
을 입력할 때와 동일하며 백엔드는 요청을http://localhost/feedmo/do/HelloView
로 전달하므로 404가 보고됩니다.의
따라서 페이지 출력은 대문자여야 합니다HelloView#doGet
은user
이고 이 문장null
은String message = (String)request.getAttribute("message");
이 NPE 예외를 발생시켜야 하는 것처럼 느껴집니다.request.getAttribute("message")
의 경우null
을 강제 변환하면 NPE 예외가 발생합니다. NPE 예외가 발생하지 않고null
이message
라고 가정하면null
및user
를 html 템플릿에 채우면 다음 코드가 됩니다.message
으아악가 표시됩니다.
null
오랫동안 와일드 서블릿 코드를 작성하지 않았기 때문에 살펴보고 일반적인 생각을 공유했습니다
http://localhost/feedmo/it
이 페이지는null
으로 표시되는데,out.flush()
을 호출하지 않았기 때문일까요? 후자는writer
close
를 작성하고 나면 필요하다고 하더군요.를
http://localhost/feedmo/do
로 바꿔야 하기 때문이 아닐까요?request.getRequestDispatcher("HelloView")
request.getRequestDispatcher("/feedmo/it")