java - 关于servlet中@webservlet的参数设置及路径的疑惑
大家讲道理
大家讲道理 2017-04-18 09:25:12
0
2
343

首先,编译了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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(2)
Ty80

나도 네이티브 서블릿을 본지 꽤 됐는데...

Q: @WebServlet에 다른 설정이 필요한가요? 그렇다면 오류가 나기 때문에 항상 web.xml이 구성되어 있어서 문제가 많습니다

A:@WebServlet은 Servlet 3.0용 주석이며 해당 tomcat 버전에서 지원되어야 합니다. @WebServlet이(가) 오류를 보고했다고 하셨습니다. 구체적으로 어떤 오류를 보고하셨나요? 여기에 작성하신 @WebServlet에 문제가 있는 것 같습니다.

에서 확인해 보세요.

Q:http://localhost/feedmo/do 프롬프트 404

A: 404를 보고하는 이유는 코드가 요청 전달을 구현했기 때문입니다. getRequestDispatcher 매개변수의 형식 매개변수 이름을 보면 url 문자열이 다음과 같아야 함을 알 수 있습니다. 여기에 전달된 이름 servlethttp://localhost/feedmo/do을 입력할 때와 동일하며 백엔드는 요청을 http://localhost/feedmo/do/HelloView로 전달하므로 404가 보고됩니다.

Q: http://localhost/feedmo/it 페이지에는 null만 표시됩니다

A: GET 요청은 URL 매개변수와 속성을 전달하지 않으므로

HelloView#doGetuser이고 이 문장 nullString message = (String)request.getAttribute("message");이 NPE 예외를 발생시켜야 하는 것처럼 느껴집니다. request.getAttribute("message")의 경우 null을 강제 변환하면 NPE 예외가 발생합니다. NPE 예외가 발생하지 않고 nullmessage라고 가정하면 nulluser를 html 템플릿에 채우면 다음 코드가 됩니다. message 으아악

따라서 페이지 출력은 대문자여야 합니다

그리고 브라우저 탭 제목에도

가 표시됩니다. null

巴扎黑

오랫동안 와일드 서블릿 코드를 작성하지 않았기 때문에 살펴보고 일반적인 생각을 공유했습니다

  1. http://localhost/feedmo/it 이 페이지는 null으로 표시되는데, out.flush()을 호출하지 않았기 때문일까요? 후자는 writer close를 작성하고 나면 필요하다고 하더군요.

  2. 404페이지를 쓴 이유는

    http://localhost/feedmo/do로 바꿔야 하기 때문이 아닐까요?request.getRequestDispatcher("HelloView")request.getRequestDispatcher("/feedmo/it")

  3. 주석을 추가하면 컴파일 오류가 직접 보고되나요, 아니면 런타임 중에 오류가 보고되나요?

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿