javaweb登录注册功能代码

遇到的问题
用post无法获取数据,用get可以是为什么
使用post无法获取数据,应该是同学在jsp中使用了enctype=“multipart/form-data”。因为这表示指定传输数据为二进制类型,所以获取不到传来的值。同学可尝试将其删除。

项目收获:
${pageContext.request.contextPath}获得页面全局路径
οnsubmit=“return ff()”当表单提交时完成校验工作(ff()中必须用return false/ture)
request域知识一次请求范围有效
equals()比较是区分大小写的
equalsIgnoreCase();忽略大小写

案例知识分析:
一.MVC设计模式(model view controller),一种设计模式,把应用程序分成三个核心模块:模型、视图、控制器。
JavaWeb开发历程
Servelt
缺陷:1.需要配置 2.显示数据

Jsp
缺陷:1.数据处理

Jsp+JavaBean (适用于开发小型案例)
缺陷:1.后期维护会很麻烦
优点:使用JavaBean封装和处理数据 使用JSP显示数据

Servlet+JSP+JavaBean
(Servlet+JSP+JavaBean其实就是MVC设计模式,请求交给Servlet(C)-JavaBean(M)-JSP(V))
将用户的请求数据交给Servlet处理,Servlet调用JavaBean封装和处理数据,将结果用JSP进行显示

包:domain实体用于保存单个用户信息
Utils工具,文件上传
一.注册功能的实现
Jar包 jstl.jar和standard.jar是jstl标签库的
commons-io-1.jar和commons-fileupload-1.2.1.jar文件上传的
1.用户信息保存
将集合存到servletcontext全局域,即信息可以在项目的任意一个地方用到了。
2.把用户的信息保存到集合中去
3.
3.5.解决文件上传名字重复的问题
建个UploadUtils
Public static getUnidFileName(String fileName){
Int idx = fileName.lastIndexOf(“.”);
String exName=fileName.subString(idx);//.jpg
String uuidFileName = UUID.randomUUID().toString().replace(“-”,””)+exName;
Return uuidFileName;
}
4.接收数据
//创建Map集合,用以保存数据
Map<String,String> map=new HashMap<String,String>();
//创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//创建核心解析类
ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
Try{

List list=fileUpload.parseRequest(request);
//4.遍历集合获得每个部分的对象
For(FileItem fileItem:list){
If(fileItem.isFormField()){
//普通项
//获得普通项的名称
String name=fileItem.getFiledName();
//获得普通项的值
String value=fileItem.getString(“UTF-8”);
//保存数据
map.put(name,value);
System.out.println(name+””+value);
}else{
//文件上传项
//获得文件的名称
String fileName=fileItem.getName();

//获得唯一文件名
String uuidFileName=UploadUtils.getUuidFileName(fileName);
//获得文件的输入流(获得文件的内容)
InputStream id =fileItem.getInputStream();
//需要将文件写入到服务器的某个路劲即可
String path =getServletContext().getRealPath(“/upload”);(得到uoload的磁盘绝对路径)//D://
//图片路径的存储
Map.put(“path”,request.getContextPath()+”/upload/”+uuidFileName);
//创建输出流与输入流进行对接
OutputStream os =new FileOutputStream(path+”\”+uuidFileName);
Int len=0;
btye[] b=new byte[1024];//定义一个byte数组。
While((len = is.read(b))!=-1){//is.read(b)是从输入流中读取数据存放到b数组中
Os.write(b,0,len);
//read()方法的返回值len是读入缓冲区的字节总数。
//os.write(b,0,len)则是从b字节中写入len字节到文件输出流。

}
Is.close();
Os.close();
}
}catch(FileUploadException e){
E.peintStackTrace();
}
5.封装数据user.setUsername(map.get(“username”));
user.setUsername(map.get(“password”));
User.setPath(map.get(“path”));
6.处理数据(把用户的信息存入集合里面去,正常不会再servlet中写,不利于后期处理)
用接口 public void regist(List userList,User user);
再简一个实现(接口)类 userList.add(user);
在servlet中 UserServlet userServlet=new UserServletImpl();
从ServletContext域中获取集合
List userList=(List)getServletContext.getAttribute(“userList”);

userServlet.regist(userList,user);
7.显示结果 response.sendRedirect(request.getContextPath()+”/login.jsp”).

二.文件上传(技术:FileUpload)
FileUpload:实现java环境下的文件上传功能,依赖于Commons IO组件,可直接查FileUpload,去官网看类,方法
需要的包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar

文件上传三要素:
表单的提交方式必须是POST,因为GET是有大小限制的
表单中需要有文件上传表单项,必须有name属性

表单的enctype属性的值需要时multipart/form-data
文件上传原理

设置了enctype=“multipart/form-data”
将我们的请求进行解析,解析以后,获得相应部分,得到分割线,通过分割线,将下面进行分割,分割的部分可以获取相应的内容
是文件项我们就做文件上传,不是文件项把它的值进行接收
不设置enctype=“multipart/form-data” ,只有文件的名称没有文件的内容

常见类
DiskFileItemFactory 磁盘文件项工厂
DiskFileItemFactory(int sizeThreshole 文件上传时缓冲区的大小,File repository 临时存放的位置)
ServletFileUpload 核心解析类
List parseRequest(HttpServletRequest request)
FileItem 文件项(解析后的部分)

1.创建磁盘文件项工厂(不创建他,核心类创建不了)
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
2.创建核心解析类
ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
3.解析请求对象,将请求分成几个部分(FileItem)

二.登录代码的实现
1.login.jsp
2.//接收数据
String username=request.getParameter(“username”);
3.封装数据
User.getUsername(username);
4.处理数据:完成登录
UserService userServlet=new UserServiceImpl();
userService.login(userList,user);//login()方法判断用户和密码是否正确
5.显示结果
If(existUser==null){
Request.setAttribute(“msg”,”用户名和密码错误!”);
Request.getRequestDispatcher(“login.jsp”).forward(request,response);
}else{
Request.getSession().setAttribute(“existUser”,existUser);
Response.sendRedirect(request.getContextPath()+”index.jsp”);
}
6.主页显示图片
Header.jsp
<c:if test=” e m p t y e x i s t U s e r ” > < / c : i f > < c : i f t e s t = ” {empty existUser}”></c:if> <c:if test=” emptyexistUser></c:if><c:iftest={not empty existUser} ”>

</c:if>
三.验证码的生成及校验
<img src=”${pageContext.request.contextPath}/CheckImgServlet”id=”codeImg” onClick=”changeImg()”>
1.在内存中生成一个图片(设置背景色绘制边框)
Int width=130;
Int height=30;
//生成图片
BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//操作该图片,设置背景色及绘制边框
//画笔
Graphics graphics = bufferedImage.getGraphics();
//设置背景色
Graphics.setColor(Color.YELLOW);
//背景色的填充
Graphics.fillRect(0,0,width,height);
//绘制边框
Graphics.setColor(Color.BLUE);
Graphics.drawRect(0,0,width-1,height-1);

2.生成随机的4个字母或数字,旋转角度
Graphics2D g2d=(Graphics2D)graphics;
g2d.setColor(Color.Black);
g2d.setFont(new Font(“宋体”,Font.BOLD,18));
String words=”ABCDEFGHIJKLMNOPQRSTUVWSYZabcdefghijklmnopqrstuvwsyz0123456789”;
Random random=new Random();
StringBuffer sb=new StringBuffer();
Int x=10;
For(int i=0;i<4;i++){
Int idx=random.nextInt(words.length());
Char ch=words.charAt(idx);
//旋转角度 -30到30之间
Int jiaodu=random.nextInt(60) - 30;
//将角度转换成弧度
Double theta =jiaodu * Math.PI/180;
//将产生字符存入到StringBuffer中
Sb.append(ch);
G2d.rotate(theta , x, 20);
g2d.drawString(String.valueOf(ch),x,20);//String.valueOf(ch) 字符转换成字符串
G2d.rotate(-theta,x,20);
X+=30;
}
//将产生的字符串存入到session中:
Request.getSession().serAttribute(“checkCode”,sb.toString());
3.将随机产生的字母或数字写入到图片上
4.将图片显示到页面上
ImageIo.write(bufferedImage,”jpg”,response.getOutputStream());
5.验证码看不清换一张
Function changeImg(){
codeImg=document.getElementById(“codeImg”);
codeImg.src=”${pageContext.request.contextPath}/CheckImgServlet?name=”+new Date().getTime();//当前时间的毫秒
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值