web实现注册登录功能
今天在写web实现注册登录功能的时候遇到一点问题,写下来作为记录。本人小白一枚,文中难免会有纰漏,请批评指正。
首先简单介绍一下项目,项目中暂时不涉及数据库,使用List集合来实现数据存储。项目使用的是MVC模型。主要动能是实现用户的注册登录,jsp页面负责View层的显示,Servlet负责处理请求,JavaBean负责封装数据。
下面贴出项目结构
下面写出出现的问题和注意事项
1.在写好了regist.jsp和RegistServlet.java之后。测试过程中发现regist.jsp中的form表单提交给RegistServlet.java时。服务器报错404。
首先检查web.xml文件,并没有发现什么问题。之后再build中发现没有任何文件。
那么如何配置呢。右键工程名->BuildPath->ConfigBuildPath,打开如图界面
双击Included.得到如图
点击Add Multiple,这里我们就看到我们的JavaBean和Servlet类。全选确认
回到这个界面之后一定要勾选Allow output folders for …
然后我们再查看文件夹,就能看到我们设置好的效果
至此,服务器报错404顺利解决。
2.文件上传问题
在form表单中有一个上传文件的控件
<tr>
<td class="td1">上传头像</td>
<td><input type="file" id="photo" name="upload"></td>
</tr>
如何进行实现呢。首先了解文件上传的条件
<!--
1.表单必须是post方式提交
2.表单中必须含有文件上传项,文件上传项必须要有name的属性和值
3.表单的enctype属性必须设置为multipart/form-data
-->
view层写好之后,那么我们的C层怎么实现呢,这里需要引入两个jar包
然后我们使用这两个包里面的方法就可以拿到form表单提交的数据,具体实现直接上代码(这里的实现还不全,后续会补充)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//数据接收
//文件上传基本操作
try {
//1.创建一个磁盘文件项工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//2.创建一个核心解析类
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//3.解析request请求,返回List集合,List集合中存放的是FileItem对象
List<FileItem> list = servletFileUpload.parseRequest(request);
//定义一个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");
System.out.println(name+"----"+value);
//接收复选框的数据
if("hobby".equals(name)) {
String hobbyValue = fileItem.getString("UTF-8");
//接收到一个值,将其存入到list集合中
hobbyList.add(hobbyValue);
hobbyValue = hobbyList.toString().substring(1, hobbyList.toString().length()-1);
System.out.println(name+" "+hobbyValue);
}
}else {
//文件上传项
//文件上传功能
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
拿到form表单的值就需要我们使用JavaBean来封装数据,JavaBean我之前写好了。这里贴上一部分代码。隐去的部分是成员变量的get()和set()方法。
public class User {
private String username;
private String password;
private String nickname;
private String sex;
private String hobby;
private String path;
}
这样每一个User对象就是一个用户,对应到数据库就是用户表中的一条记录。这里我们使用一个List集合来保存我们的用户。
生成List集合的方法放在了我们InitServlet这个Servlet文件中。
public void init() throws ServletException {
//创建一个List集合用于保存用户注册的信息
List<User> list = new ArrayList<User>();
//将list保存到ServletContext作用域中
this.getServletContext().setAttribute("list", list);
}
我们知道init()方法是Servlet在初始化时调用的,此时我们修改web.xml配置,使该方法更早调用
这样我们就得到了一个存放用户信息的List集合。
当我们在RegistServlet.java中得到form表单传递的数据时,新建一个User对象(这里需要对得到的数据进行处理),然后再将该对象加入到List集合中,就完成了用户的注册。
先写到这里,后续会完善这篇文章。文章中难免有纰漏,欢迎大家指正。