username为空时,为什么也能注册,但第二次就不会了
下面是Register源码,老师看下再哪里修改
package com.imooc.servlet;
import java.io.FileOutputStream;
/**
* Servlet implementation class RegistServlet
*/
@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 数据的接收
// 文件上传基本操作
// 注意包要导入commons那个
boolean flag = true;
Map<String, String> map = new HashMap<String, String>();
String url = null;
try {
// 1.创建一个磁盘文件项工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 2.创建一个核心解析类
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
// 3.解析request请求,返回的是List集合,List集合存放的是FileItem对象
List<FileItem> list = servletFileUpload.parseRequest(request);
// 3.1定义一个List集合用于保存兴趣爱好
List<String> hobbylist = new ArrayList<String>();
// 4.遍历结合,获得每个FileItem,判断是表单还是文件上传项
for (FileItem fileItem : list) {
if (fileItem.isFormField()) {
// 普通表单项
// 接收表单项参数的值
String name = fileItem.getFieldName(); // 获取name
String value = fileItem.getString("UTF-8"); // 获取name对应的值,且避免中文乱码问题
System.out.println(name + " " + value);
// 接收表单多项参数的值
if ("hobby".equals(name)) {
String hobbyValue = fileItem.getString("UTF-8");
hobbylist.add(hobbyValue);
// 删除两边的大括号
hobbyValue = hobbylist.toString().substring(1, hobbylist.toString().length() - 1);
System.out.println(name + " " + hobbyValue);
// 存放表单多项
map.put(name, hobbyValue);
} else {
// 存放表单项
map.put(name, value);
}
} else {
// 文件上传项
// 文件上传功能
// 获得文件上传的名称;
String fileName = fileItem.getName(); // 获取name对应的值
// 设置条件:用户名不为空的时候才能文件上传
if (fileName != null && !"".equals(fileName)) {
// 通过工具类完成唯一文件名
String uuidFlieName = UploadUtils.getUUIDFileName(fileName);
// 获得文件上传的数据
InputStream is = fileItem.getInputStream();
// 获取文件上传的路径:
String path = this.getServletContext().getRealPath("/upload");
// 将输入流对接到输出流
url = path + "\\" + uuidFlieName;
OutputStream os = new FileOutputStream(url);
int length = 0;
byte[] b = new byte[1024];
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
os.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", "用户名已经存在");
// 这时要返回注册页面,重新注册 请求转发无需再添加上文路径,
// 直接写WebContent下面的路径
request.getRequestDispatcher("/regist.jsp").forward(request, response);
return;
}
}
// 把Map数据封装到User里面,保存起来
User user = new User();
user.setUsername(map.get("username"));
user.setPassword(map.get("password"));
user.setNickname(map.get("nickname"));
user.setSex(map.get("sex"));
user.setHobby(map.get("hobby"));
user.setPath(url);
userList.add(user);
// 遍历,检查新的user有无放进去
for (User u : userList) {
System.out.println(u);
}
// 添加新的user后,再把它放回去
this.getServletContext().setAttribute("list", userList);
// 注册成功,跳转到登录页面(重定向,会重新发送一次请求,改变了http路径,但不能携带参数。如果是请求转发则不会改变且不会在发送一次,可以携带参数)
request.getSession().setAttribute("username", user.getUsername());
response.sendRedirect(request.getContextPath() + "/login.jsp");
// request.getRequestDispatcher("/login.jsp").forward(request, response);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
正在回答 回答被采纳积分+1
同学你好!的确是因为第一次将username当做空字符串存了起来,第二次在后台验证用户是否存在时,发现了想匹配的空字符串,所以提示了用户已存在呢,之前已经回答过同学的这个问题了呢
http://class.imooc.com/course/qadetail/114379
如果同学比较介意这个问题,可以在页面或者后台做非空验证呢,在后面的课程中老师会讲如何验证。如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
- 参与学习 人
- 提交作业 1088 份
- 解答问题 10204 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星