为了账号安全,请及时绑定邮箱和手机立即绑定

关于servlet中@webservlet的参数设置及路径的疑惑

关于servlet中@webservlet的参数设置及路径的疑惑

皈依舞 2019-03-14 14:15:16
首先,编译了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;之后启动tomcat,浏览器地址栏输入(其中feedmo为tomcat的server.xml文件中的Context path)http://localhost/feedmo/do提示404http://localhost/feedmo/it页面就单单显示了null这是什么原因呢,是不是文件在WEB-INF不可见的原因呢?servlet这种问题估计大多数人都不愿意看的,真不是故意的。。能看到这里真的很谢谢各位啦,望多多指教!:D是自己对getRequestDispatcher()认识生疏的问题,参数应该传入的是对应的url字符串,而不应该是servlet。所以现在访问:http://localhost/feedmo/do?user=one就可以得到first,one!的结果。谢谢好心哥哥们的帮助:P
查看完整描述

2 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

同样很久没看过原生的Servlet了……

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,所以报404;

Q:http://localhost/feedmo/it 页面就单单显示了null

A:你的GET请求没有带上url参数和属性,所以HelloView#doGet里的usernull,而这一句String message = (String)request.getAttribute("message");感觉应该会抛出NPE异常,因为request.getAttribute("message")应该为null,对null进行强制转型会触发NPE异常。假设没有触发NPE异常,messagenull,则把usermessage填充至html模板里,就会变成以下代码:

<html>

  <head>

    <meta http-equiv='Content-Type'

    content='text/html; charset=UTF-8'>

    <title>null</title>

  </head>

  <body>

    <h1>null</h1>

  </body>

</html>

所以,页面上的输出应该就是一个大写的


null

而且浏览器的标签页标题也是显示null。


查看完整回答
反对 回复 2019-04-21
  • 2 回答
  • 0 关注
  • 1172 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号