検索

ホームページ  >  に質問  >  本文

java - 关于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 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

大家讲道理大家讲道理2900日前352

全員に返信(2)返信します

  • PHP中文网

    PHP中文网2017-04-18 09:27:12

    ネイティブ サーブレットを見るのも久しぶりです...

    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 に転送するため、

    が報告されます。

    Q: http://localhost/feedmo/it ページには null のみが表示されます

    A: GET リクエストには URL パラメーターと属性が含まれていないため、HelloView#doGetusernull であり、この文 String message = (String)request.getAttribute("message"); は NPE 例外をスローする必要があるように感じられます。 request.getAttribute("message") の場合、null を強制的に変換すると NPE 例外がトリガーされます。 NPE 例外がトリガーされず、nullmessage であると仮定すると、HTML テンプレートに nulluser を入力すると、次のコードになります: message リーリー

    したがって、ページ上の出力は大文字である必要があります

    ヌル

    ブラウザのタブのタイトルにも

    が表示されます。 null

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:27:12

    長い間、ワイルドなサーブレット コードを書いていなかったため、ざっと調べて一般的な考えを共有しました

    1. http://localhost/feedmo/it このページは null として表示されています。out.flush() が呼び出されなかったことが原因でしょうか? writer close が必要かどうかを確認します。

    2. ページ 404 の理由は、

      http://localhost/feedmo/do に変更する必要があるためでしょうか?request.getRequestDispatcher("HelloView")request.getRequestDispatcher("/feedmo/it")

    3. アノテーションを追加するとコンパイル エラーが直接報告されますか、それとも実行時にエラーが報告されますか?

      @WebServlet

      返事
      0
  • キャンセル返事