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

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

大家讲道理
大家讲道理

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

répondre à tous(2)
Ty80

Cela faisait aussi longtemps que je n'avais pas vu de Servlet natif...

Q : @WebServlet a-t-il besoin d'autres paramètres ? Si c'est le cas, je ferai une erreur, donc c'est toujours le web.xml configuré, ce qui pose beaucoup de problèmes

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 ici

 ;

Q : http://localhost/feedmo/do Invite 404

A : 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îne url doit être transmis ici. Au lieu du nom servlet, votre implémentation de code ici équivaut à lors de la saisie de http://localhost/feedmo/do, le backend transmet la demande à http://localhost/feedmo/do/HelloView, donc 404 est signalé

;

Q : La page http://localhost/feedmo/it affiche uniquement null

A : Votre requête GET ne contient pas de paramètres ni d'attributs d'URL, donc le HelloView#doGet dans user est null, et cette phrase String message = (String)request.getAttribute("message"); donne l'impression qu'elle devrait lever une exception NPE, car request.getAttribute("message") devrait Pour null, la conversion forcée de null déclenchera une exception NPE. En supposant qu'aucune exception NPE n'est déclenchée et que message est null, alors remplir user et message dans le modèle html deviendra le code suivant :

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

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

  1. http://localhost/feedmo/it Cette page s'affiche comme null. Serait-ce parce que out.flush() n'a pas été appelé ? Ce dernier a dit si writer est nécessaire après avoir fini d'écrire close

    .
  2. La raison de la page 404 pourrait-elle être que http://localhost/feedmo/do doit être remplacé par request.getRequestDispatcher("HelloView") ?request.getRequestDispatcher("/feedmo/it")

  3. L'ajout de l'annotation

    signalera directement une erreur de compilation, ou une erreur sera-t-elle signalée lors de l'exécution @WebServlet

    ?
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal