点击注册报404错误

点击注册报404错误

我按照老师的代码运行之后(截止到校验用户名是否存在),输入完信息点击注册,报了404错误。

http://img1.sycdn.imooc.com//climg/5bc4668600012ce709681194.jpg

http://img1.sycdn.imooc.com//climg/5bc46686000106df16080398.jpg

我是用intellij写的代码,intellij创建的servlet和eclipse不太一样,创建后出来的是

@WebServlet(name="RegistServlet")

视频上是

@WebServlet("/RegistServlet")

当然我按照视频上配了web.xml,并且改成了"/RegistServlet",结果是根本不能部署了,所以我还是按照intellij的默认写法来(另外intellij工程里web.xml是没有代码的,出了<web-app>),不知道是不是这个原因。

正在回答

登陆购买课程后可参与讨论,去登陆

18回答

@WebServlet(name = "RegistServlet") 的作用相当于web.xml 中的<servlet-name>RegistServlet</servlet-name>

实际是没有配置对外访问路径的,所以才会404找不到。

如果同学一定要写一个属性,

@WebServlet(value = "/RegistServlet")  等于 @WebServlet( "/RegistServlet")  

目录结构既控制台结构如下:

http://img1.sycdn.imooc.com//climg/5bc6bb480001ad8614630918.jpg

InitServlet

 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.util.ArrayList;
import java.util.List;
 



public class InitServlet extends HttpServlet {
 
    @Override
    public void init() throws ServletException {
        List<User> list = new ArrayList<User>();
        this.getServletContext().setAttribute("list",list);
        System.out.println(1111);
    }
 
}

RegistServlet

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@WebServlet(value = "/RegistServlet")
public class RegistServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //数据接收
        //文件上传
        /*
            1. 创建磁盘文件项工厂对象
            2. 创建核心解析类
            3. 解析request请求,返回List集合,集合中存放FileItem对象
            4. 遍历集合,获取每个FileItem,判断是表单项还是文件上传项
         */
        try {
            //保存数据
            Map<String,String> map = new HashMap<String, String>();
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            List<FileItem> list = servletFileUpload.parseRequest(request);
            //兴趣爱好数据
            List<String> hobbylist = new ArrayList<String>();
            String url = "";
            for (FileItem fileItem : list){
                if(fileItem.isFormField()){
                    //普通表单项
                    String name = fileItem.getFieldName();
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name+"  "+value);
                    //复选框
                    if("hobby".equals(name)){
                        String hobbyValue = fileItem.getString("UTF-8");
                        hobbylist.add(hobbyValue);
                        hobbylist.toString().substring(1,hobbylist.toString().length()-1);
                        System.out.println(name+"  "+hobbylist);
                        map.put(name,hobbyValue);
                    }else {
                        map.put(name,value);
                    }
                }else{
                    //文件上传项
                    String fileName = fileItem.getName();
                    if(fileName!=null && !"".equals(fileName)){
                        String uuidFileName = UploadUtils.getUUIDFileName(fileName);
                        InputStream inputStream = fileItem.getInputStream();
                        String path = this.getServletContext().getRealPath("/upload");
                        url = path+"\\"+uuidFileName;
                        OutputStream outputStream = new FileOutputStream(url);
                        int len = 0;
                        byte[] b = new byte[1024];
                        while((len = inputStream.read(b))!=-1){
                            outputStream.write(b,0,len);
                        }
                        inputStream.close();
                        outputStream.close();
                    }
                }
            }
            System.out.println(map);
            List<User> userlist = (List<User>)this.getServletContext().getAttribute("list");
            //校验用户名
            for(User u:userlist){
                if (u.getUsername().equals(map.get("username"))) {
                    request.setAttribute("msg","用户名已经存在!");
                    request.getRequestDispatcher("/regist.jsp").forward(request,response);
                    System.out.println(3333);
                    return;
                }
            }
            //封装数据到User
            User user = new User();
            user.setUsername(map.get("username"));
            user.setPassword(map.get("password"));
            user.setSex(map.get("sex"));
            user.setNickname(map.get("nickname"));
            user.setHobby(map.get("hobby"));
            user.setPath(url);
            //将用户信息存入List集合
            userlist.add(user);
            for(User u:userlist){
                System.out.println(u);
            }
            this.getServletContext().setAttribute("list",userlist);
            //跳转到登陆页面
            request.getSession().setAttribute("username",user.getUsername());
           // response.sendRedirect(request.getContextPath()+"/login.jsp");
            response.sendRedirect(this.getServletContext().getContextPath()+"/login.jsp");
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}

UploadUtils

import java.util.UUID;
/**
 * 文件上传的工具类
 * @author jt
 *
 */
public class UploadUtils {
   /**
    * 生成唯一的文件名:
    */
   public static String getUUIDFileName(String fileName){
      // 将文件名的前面部分进行截取:xx.jpg   --->   .jpg
      int idx = fileName.lastIndexOf(".");
      String extention = fileName.substring(idx);
      String uuidFileName = UUID.randomUUID().toString().replace("-", "")+extention;
      return uuidFileName;
   }
   
   public static void main(String[] args) {
      System.out.println(getUUIDFileName("1.jpg"));
   }
}


  • 风岚醉 提问者 #1
    成功了,看来确实是@WebServlet(value = "/RegistServlet")这句话的问题。当然还做了一个改动,就是把那几个jar包从External Library移动到了内部的lib里面,这里也可能是出错的地方。总之老师辛苦了,非常感谢。
    2018-10-17 19:42:30
好帮手慕阿莹 2018-10-17 12:26:45

以下是老师的代码,因为太长,分两部分

User

/**
 * 用户的实体类
 * @author jt
 *
 */
public class User {
   private String username;
   private String password;
   private String nickname;
   private String sex;
   private String hobby;
   private String path;
   public String getUsername() {
      return username;
   }
   public void setUsername(String username) {
      this.username = username;
   }
   public String getPassword() {
      return password;
   }
   public void setPassword(String password) {
      this.password = password;
   }
   public String getNickname() {
      return nickname;
   }
   public void setNickname(String nickname) {
      this.nickname = nickname;
   }
   public String getSex() {
      return sex;
   }
   public void setSex(String sex) {
      this.sex = sex;
   }
   public String getHobby() {
      return hobby;
   }
   public void setHobby(String hobby) {
      this.hobby = hobby;
   }
   public String getPath() {
      return path;
   }
   public void setPath(String path) {
      this.path = path;
   }
   @Override
   public String toString() {
      return "User [username=" + username + ", password=" + password + ", nickname=" + nickname + ", sex=" + sex
            + ", hobby=" + hobby + ", path=" + path + "]";
   }
   
   
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
           version="4.0">
    <display-name>reg_login</display-name>
    <servlet>
        <display-name>InitServlet</display-name>
        <servlet-name>InitServlet</servlet-name>
        <servlet-class>InitServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>InitServlet</servlet-name>
        <url-pattern>/InitServlet</url-pattern>
    </servlet-mapping>
</web-app>


login.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/10/17
  Time: 12:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
登录界面
</body>
</html>

regist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <link rel="stylesheet" href="./css/reg.css">
</head>
<body>
<div class="reg">
    <div class="header">
        <h1>
            <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
        </h1>
    </div>
    <!--
        文件上传需要用post提交
        表单中有文件上传项,上传项有name和value
        enctype属性设置为multipart/form-data
    -->
    <%
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()
                +"/"+request.getServletContext().getContextPath()+"/";
        String msg = "";
        if(request.getAttribute("msg") != null){
            msg = (String)request.getAttribute("msg");
        }
    %>
    <h3 style="color: red"><%=msg%></h3>
    <form action="<%=basePath%>RegistServlet" method="post" enctype="multipart/form-data">
        <table>
            <tr>
                <td class="td1">用户名</td>
                <td><input type="text" class="input1" name="username"></td>
            </tr>
            <tr>
                <td class="td1">密码</td>
                <td><input type="password" class="input1" name="password"></td>
            </tr>
            <tr>
                <td class="td1">昵称</td>
                <td><input type="text" class="input1" name="nickname"></td>
            </tr>
            <tr>
                <td class="td1">性别</td>
                <td>
                    <input type="radio" name="sex" value="male">男
                    <input type="radio" name="sex" value="female">女
                </td>
            </tr>
            <tr>
                <td class="td1">上传头像</td>
                <td><input type="file" id="photo" name="upload"></td>
            </tr>
            <tr>
                <td class="td1">兴趣爱好</td>
                <td><label>
                    <input type="checkbox" name="hobby" value="篮球">篮球
                    <input type="checkbox" name="hobby" value="足球">足球
                    <input type="checkbox" name="hobby" value="排球">排球
                    <input type="checkbox" name="hobby" value="羽毛球">羽毛球
                </label></td>
            </tr>
            <tr>
                <td colspan="2">
                    <div class="btn-red">
                        <input type="submit" value="注册" id="reg-btn">
                    </div>
                </td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

请同学新建一个工程,把老师的代码粘进去试试。看看是否还报错。

运行环境:

jdk1.8 

 tomcat 8

祝学习愉快


提问者 风岚醉 2018-10-17 11:31:29

用原来的写法,也就是@WebServlet(name="RegistServlet")是不会报错的,我感觉这就是Intellij的特性,工程就是这么建的。只不过在Intellij上照着老师代码写,点击注册就报了404错误。老师运行成功的代码是用Intellij建的工程吗?方便的话发我邮箱?

提问者 风岚醉 2018-10-17 10:13:44
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <display-name>reg_login</display-name>
    <servlet>
        <display-name>InitServlet</display-name>
        <servlet-name>InitServlet</servlet-name>
        <servlet-class>com.imooc.servlet.InitServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>InitServlet</servlet-name>
        <url-pattern>/InitServlet</url-pattern>
    </servlet-mapping>
</web-app>

这个是当前的xml

提问者 风岚醉 2018-10-16 18:26:39

16-Oct-2018 18:22:25.203 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method manageApp

 java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Reglogin]]

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:746)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

16-Oct-2018 18:22:25.203 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method createStandardContext

 javax.management.RuntimeOperationsException: Exception invoking method manageApp

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:295)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

[2018-10-16 06:22:25,210] Artifact reglogin:war exploded: Error during artifact deployment. See server log for details.

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

Caused by: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Reglogin]]

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:746)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

... 33 more


修改后,报了这些错误(两个回答放在一起看)。

我也注意到了Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException

但我确实导包了,给个图,难道这个包有问题?

http://img1.sycdn.imooc.com//climg/5bc5bcd60001647619720634.jpg

  • 同学是一启动就报错呢还是点击注册后报错的呢?
    2018-10-16 18:41:40
  • 提问者 风岚醉 回复 好帮手慕阿莹 #2
    这里是一启动就报错
    2018-10-16 18:44:00
  • 好帮手慕阿莹 回复 提问者 风岚醉 #3
    建议同学贴一下你修改后的web.xml 或者把老师之前修改好的这个web.xml替换一下你的试试。 祝学习愉快
    2018-10-16 19:09:24
提问者 风岚醉 2018-10-16 18:24:23

16-Oct-2018 18:22:25.200 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 

 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Reglogin]]

at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:742)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException

at java.lang.Class.getDeclaredFields0(Native Method)

at java.lang.Class.privateGetDeclaredFields(Class.java:2583)

at java.lang.Class.getDeclaredFields(Class.java:1916)

at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:110)

at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:269)

at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:137)

at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:69)

at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:328)

at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)

at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)

at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5007)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

... 42 more

Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileUploadException

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1138)

... 55 more



好帮手慕阿莹 2018-10-16 17:19:41

1、从报错信息来看可能是web.xml有问题,并且建议同学看看commons-fileupload-1.2.1.jar是否加载进去了。

2。initServlet的路径建议配置在web.xml中。因为要设置initServlet的<load-on-startup>2</load-on-startup>,

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
           version="4.0">
    <display-name>reg_login</display-name>
    <servlet>
        <display-name>InitServlet</display-name>
        <servlet-name>InitServlet</servlet-name>
        <servlet-class>InitServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>InitServlet</servlet-name>
        <url-pattern>/InitServlet</url-pattern>
    </servlet-mapping>

</web-app>

3、initServlet 去掉注解。

4、RegistServlet的注解写作@WebServlet("/RegistServlet")

并且建议向upload文件夹中随意放一些文件,以便于idea发布的时候把upload也发布进去,否则idea不发布空的文件夹。

运行结果如下:

http://img1.sycdn.imooc.com//climg/5bc5acab00011aee10990255.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

提问者 风岚醉 2018-10-16 14:34:59

16-Oct-2018 14:20:57.545 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method manageApp

 java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/reg_login]]

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:746)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

16-Oct-2018 14:20:57.546 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method createStandardContext

 javax.management.RuntimeOperationsException: Exception invoking method manageApp

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:295)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

Caused by: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/reg_login]]

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:746)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

... 33 more


接上条回复,剩下的错误信息

提问者 风岚醉 2018-10-16 14:34:15

16-Oct-2018 14:20:57.543 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 

 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/reg_login]]

at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:742)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException

at java.lang.Class.getDeclaredFields0(Native Method)

at java.lang.Class.privateGetDeclaredFields(Class.java:2583)

at java.lang.Class.getDeclaredFields(Class.java:1916)

at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:110)

at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:269)

at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:137)

at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:69)

at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:328)

at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)

at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)

at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5007)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

... 42 more

Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileUploadException

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1138)

... 55 more




我按照上一条回复说的都改成

@WebServlet("/RegistServlet")

@WebServlet("/InitServlet")

并且把web.xml的代码删了,运行后报了这些错误

  • 提问者 风岚醉 #1
    代码见上面的回复内容,如果还需要其他代码我可以再贴。
    2018-10-16 14:45:12
好帮手慕阿莹 2018-10-16 09:39:45

建议同学按照老师的方式再试一下,并且把InitServlet的注解去掉。

http://img1.sycdn.imooc.com//climg/5bc541090001653407170299.jpg

从报错信息来看,InitServlet的路径配置重复了。建议同学去掉试试。

报错信息同学可以着重看Caused by : 后边的内容。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 风岚醉 #1
    这个其实不是最核心的问题。我只要按照intellij默认的写法@WebServlet(name="RegistServlet"),就可以运行,关键是点击注册后404错误。我只是怀疑这两个问题之间是不是有关联,现在我还是想解决那个404问题。
    2018-10-16 09:42:56
  • 好帮手慕阿莹 回复 提问者 风岚醉 #2
    同学可以把@WebServlet(name="RegistServlet")前边的name去掉,并在RegistServlet前边加/。 改为: @WebServlet("/RegistServlet") 经测试,是可以访问到的。 祝学习愉快
    2018-10-16 10:11:38
  • 提问者 风岚醉 回复 好帮手慕阿莹 #3
    这样改就报错了啊,话说点击注册后404是因为这里name的问题吗?
    2018-10-16 14:23:35
提问者 风岚醉 2018-10-15 20:10:42

InitServlet我也贴一下好了,另外两个是纯后台逻辑应该没影响吧。

package com.imooc.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.util.ArrayList;
import java.util.List;

import com.imooc.domian.*;

@WebServlet(name="InitServlet")
public class InitServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        List<User> list = new ArrayList<User>();
        this.getServletContext().setAttribute("list",list);
    }

}


提问者 风岚醉 2018-10-15 20:09:26
提问者 风岚醉 2018-10-15 20:08:37

RegistServlet

package com.imooc.servlet;

import com.imooc.domian.User;
import com.imooc.utils.UploadUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@WebServlet(name="RegistServlet")
public class RegistServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //数据接收
        //文件上传
        /*
            1. 创建磁盘文件项工厂对象
            2. 创建核心解析类
            3. 解析request请求,返回List集合,集合中存放FileItem对象
            4. 遍历集合,获取每个FileItem,判断是表单项还是文件上传项
         */
        try {
            //保存数据
            Map<String,String> map = new HashMap<String, String>();
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            List<FileItem> list = servletFileUpload.parseRequest(request);
            //兴趣爱好数据
            List<String> hobbylist = new ArrayList<String>();
            String url = "";
            for (FileItem fileItem : list){
                if(fileItem.isFormField()){
                    //普通表单项
                    String name = fileItem.getFieldName();
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name+"  "+value);
                    //复选框
                    if("hobby".equals(name)){
                        String hobbyValue = fileItem.getString("UTF-8");
                        hobbylist.add(hobbyValue);
                        hobbylist.toString().substring(1,hobbylist.toString().length()-1);
                        System.out.println(name+"  "+hobbylist);
                        map.put(name,hobbyValue);
                    }else {
                        map.put(name,value);
                    }
                }else{
                    //文件上传项
                    String fileName = fileItem.getName();
                    if(fileName!=null && !"".equals(fileName)){
                        String uuidFileName = UploadUtils.getUUIDFileName(fileName);
                        InputStream inputStream = fileItem.getInputStream();
                        String path = this.getServletContext().getRealPath("/upload");
                        url = path+"\\"+uuidFileName;
                        OutputStream outputStream = new FileOutputStream(url);
                        int len = 0;
                        byte[] b = new byte[1024];
                        while((len = inputStream.read(b))!=-1){
                            outputStream.write(b,0,len);
                        }
                        inputStream.close();
                        outputStream.close();
                    }
                }
            }
            System.out.println(map);
            List<User> userlist = (List<User>)this.getServletContext().getAttribute("list");
            //校验用户名
            for(User u:userlist){
                if (u.getUsername().equals(map.get("username"))) {
                    request.setAttribute("msg","用户名已经存在!");
                    request.getRequestDispatcher("/regist.jsp").forward(request,response);
                    return;
                }
            }
            //封装数据到User
            User user = new User();
            user.setUsername(map.get("username"));
            user.setPassword(map.get("password"));
            user.setSex(map.get("sex"));
            user.setNickname(map.get("nickname"));
            user.setHobby(map.get("hobby"));
            user.setPath(url);
            //将用户信息存入List集合
            userlist.add(user);
            for(User u:userlist){
                System.out.println(u);
            }
            this.getServletContext().setAttribute("list",userlist);
            //跳转到登陆页面
            request.getSession().setAttribute("username",user.getUsername());
            response.sendRedirect(request.getContextPath()+"/login.jsp");
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}


提问者 风岚醉 2018-10-15 20:02:18

regist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
<link rel="stylesheet" href="./css/reg.css">
</head>
<body>
    <div class="reg">
        <div class="header">
            <h1>
                <a href="./login.jsp">登录</a> <a href="./regist.jsp">注册</a>
            </h1>
        </div>
        <!--
            文件上传需要用post提交
            表单中有文件上传项,上传项有name和value
            enctype属性设置为multipart/form-data
        -->
        <%
            String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()
                    +"/"+request.getServletContext().getContextPath()+"/";
            String msg = "";
            if(request.getAttribute("msg") != null){
                msg = (String)request.getAttribute("msg");
            }
        %>
        <h3 style="color: red"><%=msg%></h3>
        <form action="<%=basePath%>/RegistServlet" method="post" enctype="multipart/form-data">
            <table>
                <tr>
                    <td class="td1">用户名</td>
                    <td><input type="text" class="input1" name="username"></td>
                </tr>
                <tr>
                    <td class="td1">密码</td>
                    <td><input type="password" class="input1" name="password"></td>
                </tr>
                <tr>
                    <td class="td1">昵称</td>
                    <td><input type="text" class="input1" name="nickname"></td>
                </tr>
                <tr>
                    <td class="td1">性别</td>
                    <td>
                        <input type="radio" name="sex" value="male">男
                        <input type="radio" name="sex" value="female">女
                    </td>
                </tr>
                <tr>
                    <td class="td1">上传头像</td>
                    <td><input type="file" id="photo" name="upload"></td>
                </tr>
                <tr>
                    <td class="td1">兴趣爱好</td>
                    <td><label> 
                        <input type="checkbox" name="hobby" value="篮球">篮球
                        <input type="checkbox" name="hobby" value="足球">足球
                        <input type="checkbox" name="hobby" value="排球">排球 
                        <input type="checkbox" name="hobby" value="羽毛球">羽毛球
                    </label></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <div class="btn-red">
                            <input type="submit" value="注册" id="reg-btn">
                        </div>
                    </td>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>


提问者 风岚醉 2018-10-15 19:54:33

我如果把@WebServlet(name="RegistServlet")改成@WebServlet("/RegistServlet"),然后在web.xml里面写

<display-name>reg_login</display-name>
<servlet>
    <display-name>InitServlet</display-name>
    <servlet-name>InitServlet</servlet-name>
    <servlet-class>com.imooc.servlet.InitServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>InitServlet</servlet-name>
    <url-pattern>/InitServlet</url-pattern>
</servlet-mapping>

也就是老师eclipse的写法,就会这样(字数超出了,后面还有一大堆):

[2018-10-15 07:52:18,419] Artifact reglogin:war exploded: Artifact is being deployed, please wait...
15-Oct-2018 19:52:18.649 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Reglogin]]
	at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:742)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
	at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
	at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
	at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
	at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
	at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
	at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
	at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
	at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
	at sun.rmi.transport.Transport$1.run(Transport.java:200)
	at sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: The servlets named [InitServlet] and [com.imooc.servlet.InitServlet] are both mapped to the url-pattern [/InitServlet] which is not permitted
	at org.apache.tomcat.util.descriptor.web.WebXml.addServletMappingDecoded(WebXml.java:329)
	at org.apache.tomcat.util.descriptor.web.WebXml.addServletMapping(WebXml.java:322)
	at org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(ContextConfig.java:2418)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2095)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1981)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1975)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1975)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1975)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1146)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:765)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5007)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	... 42 more
好帮手慕阿莹 2018-10-15 19:00:26

根本部署不了的表现是什么呢?tomcat启动的时候报错么?

报错信息提示是什么呢?

建议同学提供一下你的注册的jsp页面,你的RegistServlet 以及你的项目目录截图

注意不要贴在回复里,会失去代码的格式。可以在回答里贴一下。祝学习愉快。

提问者 风岚醉 2018-10-15 18:29:34

http://img1.sycdn.imooc.com//climg/5bc46bfb000182bb21421580.jpg

我的发布路径带了名字

  • 提问者 风岚醉 #1
    <form action="/reg_login/RegistServlet" method="post" enctype="multipart/form-data"> 是要改这个action的路径吗?
    2018-10-15 18:46:25
好帮手慕阿莹 2018-10-15 18:22:22

建议同学看一下你的idea发布的项目路径是否是/

http://img1.sycdn.imooc.com//climg/5bc46a040001662807570264.jpg

如果是,建议把注册时提交的地址去掉项目名。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java Web基础入门2018版
  • 参与学习       716    人
  • 提交作业       185    份
  • 解答问题       1363    个

会Java?懂前端基础?想学后台开发?那么,赶快来学习《Java Web入门》路径吧。本路径主要介绍Java Web的基础知识,并配有大量案例,定会让你收获多多!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师