JavaWeb新手小项目以及源码

article/2025/10/12 9:56:57

此项目主要实现的功能有:
jsp连接数据库、MD5加密、验证码验证、Ajax、文件的上传与下载、session登录验证等。

先来几张截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、首先写登录页面 login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html><head><title>WormJam-登录</title><link rel="stylesheet" href="css/style.css" type="text/css"></head><body><div class="loginHeader"><div class="title"><center><span>WormJam</span></center><center><h3>秀出你的源代码</h3></center></div></div>		<div class="form"><form method="post" name="loginForm">账号:<input type="text" name="account" onInput="accountChange()"><span id="accountText"> </span><span id="loginInfo"></span><br><br>密码:<input type="password" name="password" onInput="passwordChange()"><span id="passwordText"> </span><br><br>	验证码:<input type="text" name="code" size="10" onInput="validate()"><img name="imgValidate" "refresh()" border=0 src="validate.jsp"></img><span id="codeText" name="codeText" style="color:green"> </span><br><br>	<input type="button" value="登录" "validateSubmit()"><a href="register.jsp">注册</a></form></div><script>//验证账号密码格式function accountChange(){var str = loginForm.account.value;var reg = /[a-zA-Z0-9]{6,16}/;if(reg.test(str)){accountText.innerHTML = "√";accountText.style.color = "green";}else{accountText.innerHTML = "账号为6至16位数字或字母!";accountText.style.color = "red";}}function passwordChange(){var str = loginForm.password.value;var reg = /^[x00-x7f]+$/;if(reg.test(str) && str.length>5 && str.length<17){passwordText.innerHTML = "√";passwordText.style.color = "green";}else{passwordText.innerHTML = "密码必须是6至16位!";passwordText.style.color = "red";}}//验证码刷新function refresh(){//加入随机参数防止调用浏览器缓存loginForm.imgValidate.src = "validate.jsp" + "?id=" + Math.random();}//表单提交验证function validateSubmit(){if(accountText.innerHTML=="√" && passwordText.innerHTML == "√" && codeText.innerHTML == "√"){var account = loginForm.account.value;var password = loginForm.password.value;var xmlHttp = new XMLHttpRequest();var url = "LoginServlet?account=" + account + "&password=" + password;xmlHttp.open("POST",url,true);xmlHttp.onreadystatechange = function(){if(xmlHttp.readyState == 4){loginInfo.innerHTML = xmlHttp.responseText;}else{loginInfo.innerHTML = "正在验证密码……";}}xmlHttp.send();}else{return false;}}			//AJAXfunction validate(){var code = loginForm.code.value;var xmlHttp = new XMLHttpRequest();var url = "ValidateServlet?code=" + code;xmlHttp.open("POST",url,true);xmlHttp.onreadystatechange = function(){if(xmlHttp.readyState == 4){codeText.innerHTML = xmlHttp.responseText;}else{codeText.innerHTML = "正在验证……";}}xmlHttp.send();}</script></body>
</html>

登录的表单里先不看验证码,为了限制账号及密码 的格式为6至16位的数字或字母,用input里的onInput事件,当账号或密码框中的值发生改变时即调用accountChange()或passwordChange()函数进行输入格式的验证。accountChange()中的正则表达式/[a-zA-Z0-9]{6,16}/;表示6至16位的字母或数字,passwordChange()中的/1+$/表示键盘上能够输入的符号。

二、生成验证码validate.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<%@ page import="java.awt.*" import="java.awt.image.BufferedImage" import="javax.imageio.ImageIO" %>
<html>
<body>
<%response.setHeader("Cache-Control", "no-cache");//在内存中创建图像int width = 60,height = 20;BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//获取画笔Graphics g = image.getGraphics();//设置背景色g.setColor(new Color(200,200,200));g.fillRect(0,0,width,height);//随机产生验证码Random rnd = new Random();int randNum = rnd.nextInt(8999) + 1000;String randStr = String.valueOf(randNum);//将验证码存入sessionsession.setAttribute("randStr",randStr);//将验证码显示在图像中g.setColor(Color.black);g.setFont(new Font("",Font.PLAIN,20));g.drawString(randStr,10,17);//随机产生100个随机点for(int i=0;i<100;i++){int x = rnd.nextInt(width);int y = rnd.nextInt(height);g.drawOval(x,y,1,1);}//输出图像到页面ImageIO.write(image,"JPEG", response.getOutputStream());out.clear();out = pageContext.pushBody();
%>
</body>
</html>

这段代码生成一个验证码并放在图片中显示,然后login.jsp的登录表单中用img标签把这个验证码图片加载进来。

三、然后写个ValidateServlet对输入的验证码进行验证:

package servlets;import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class ValidateServlet extends HttpServlet {	//对验证码验证public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//得到提交的验证码String code = request.getParameter("code");//获取session中的验证码HttpSession session = request.getSession();String randStr = (String)session.getAttribute("randStr");//response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();if(!code.equals(randStr)){out.println("");}else{out.print("√");}}
}

当输入的验证码正确时输出"√",错误时输出空格(无显示),顺便说一句,login.jsp里的validateSubmit()可以看到,我的登录表单是通过判定输出的文本来提交的,即如果账号密码和验证码后面的文本输出不全是"√"的话就无法提交表单。
现在的问题是,在servlet中输出的话,浏览器会新打开一个页面来显示验证码验证的结果,所以要用到AJAX把输出显示在登录页验证码图片的后面,login.jsp里的validate()就使用了AJAX,使验证码验证的结果显示在id为codeText的span标签里,并传一个名为code值为你输入的验证码的参数给ValidateServlet。验证正确时就可以提交给LoginServlet进行密码的验证了。

四、在这之前先写注册页面register.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html><head><title>WormJam-注册</title><link rel="stylesheet" href="css/style.css" type="text/css"></head><body><div class="loginHeader"><div class="title"><center><span>WormJam</span></center><center><h3>秀出你的源代码</h3></center></div></div>	<div class="form"><form method="post" name="registerForm">输入账号:<input type="text" name="account" onInput="accountChange()"><br><span id="accountText"></span><br>输入密码:<input type="password" name="password1" onInput="password1Change()"><br><span id="passwordText1"></span><br>确认密码: <input type="password" name="password2" onInput="password2Change()"><br><span id="passwordText2"></span><br><span id="info"></span><br><input type="button" value="注册" "formSubmit()"><a href="login.jsp">返回登录</a></form></div><script>function accountChange(){var str = registerForm.account.value;var reg = /[a-zA-Z0-9]{6,16}/;if(reg.test(str)){accountText.innerHTML = "√";accountText.style.color = "green";}else{accountText.innerHTML = "账号为6至16位数字或字母!";accountText.style.color = "red";}}function password1Change(){var str = registerForm.password1.value;var reg = /^[x00-x7f]+$/;if(reg.test(str) && str.length>5 && str.length<17){passwordText1.innerHTML = "√";passwordText1.style.color = "green";}else{passwordText1.innerHTML = "密码必须是6至16位!";passwordText1.style.color = "red";}}function password2Change(){var str1 = registerForm.password1.value;var str2 = registerForm.password2.value;if(str1 == str2){passwordText2.innerHTML = "√";passwordText2.style.color = "green";}else{passwordText2.innerHTML = "两次密码不一致";passwordText2.style.color = "red";}}//表单验证function formSubmit(){if(accountText.innerHTML=="√" && passwordText1.innerHTML=="√" && passwordText2.innerHTML=="√"){registerSubmit();}else{return false;}}//AJAXfunction registerSubmit(){var account = registerForm.account.value;var password = registerForm.password1.value;var xmlHttp = new XMLHttpRequest();var url = "RegisterServlet?account=" + account + "&password=" + password;xmlHttp.open("POST",url,true);xmlHttp.onreadystatechange = function(){if(xmlHttp.readyState == 4){info.innerHTML = xmlHttp.responseText;}else{info.innerHTML = "正在注册……";}}xmlHttp.send();}</script></body>
</html>

表单方面包括格式验证、AJAX都和登录页面同理,提交给RegisterServlet注册,现在就要开始连接数据库操作了。JSP连接数据库的一些配置我就不赘述了。

五、数据库脚本:

create table ACCOUNTS(ACNAME varchar(16) not null,PASSWD varchar(16) not null
);

为了方便就写了这两列,账号名和密码,16位不为空。然后数据库我是采用DAO设计模式。

六、先是VO类Account.java:

package VO;public class Account {private String account;					//定义账户private String password;				//定义密码public String getAccount(){return account;}public void setAccount(String account){this.account = account;}public String getPassword(){return password;}public void setPassword(String password){this.password = password;}
}

分别定义了get和set方法。

七、然后是数据库连接类DatabaseConnection.java:

package dbc;import java.sql.*;public class DatabaseConnection {private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; private static final String DBURL = "jdbc:mysql://localhost:3306/wormjam" ;private static final String DBUSER = "root" ;private static final String DBPASSWORD = "你的密码" ;private Connection conn ;public DatabaseConnection() throws Exception {				//在构造方法中进行数据库连接Class.forName(DBDRIVER) ;								//加载驱动程序this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;}public Connection getConnection(){							//取得数据库连接return this.conn ;}public void close() throws Exception {						//关闭数据库if(this.conn != null){try{this.conn.close() ;}catch(Exception e){throw e ;}}}
}

八、然后定义DAO操作标准IAccountDAO.java:

package DAO ;import java.util.* ;
import VO.Account;public interface IAccountDAO {			//定义DAO操作public boolean doCreate(Account account) throws Exception ;public String findByAccount(String acname) throws Exception ;
}

定义了两个操作:创建和寻找。创建用来注册用户,而寻找用来比对密码是否正确。

九、接着是真实主题实现类AccountDAOImpl.java:

package DAO ;import java.util.* ;
import java.sql.* ;
import DAO.IAccountDAO; 
import VO.Account;public class AccountDAOImpl implements IAccountDAO {private Connection conn = null ;						//数据库连接对象private PreparedStatement pstmt = null ;				//数据库操作对象public AccountDAOImpl(Connection conn){					//通过构造方法取得数据库连接this.conn = conn ;}public boolean doCreate(Account account) throws Exception{ //添加账户boolean flag = false ;								//定义标志位String sql = "INSERT INTO ACCOUNTS(ACNAME,PASSWD) VALUES (?,?)" ;this.pstmt = this.conn.prepareStatement(sql) ;		//实例化PrepareStatement对象this.pstmt.setString(1,account.getAccount()) ;this.pstmt.setString(2,account.getPassword()) ;if(this.pstmt.executeUpdate() > 0){					//如果有更新操作flag = true ;}this.pstmt.close() ;return flag ;}public String findByAccount(String acname) throws Exception{//按账号查找密码String password = null;String sql = "SELECT PASSWD FROM ACCOUNTS WHERE ACNAME=?" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setString(1,acname);ResultSet rs = this.pstmt.executeQuery() ;if(rs.next()){password = rs.getString("PASSWD");}this.pstmt.close() ;return password ;}
}

十、代理主题实现类AccountDAOProxy.java:

package DAO ;import java.util.* ;
import java.sql.* ;import DAO.AccountDAOImpl; 
import DAO.IAccountDAO;
import dbc.DatabaseConnection;
import VO.Account;public class AccountDAOProxy implements IAccountDAO {private DatabaseConnection dbc = null ;private IAccountDAO dao = null ;public AccountDAOProxy() throws Exception {		//在构造方法中实例化连接,同时实例化dao对象this.dbc = new DatabaseConnection() ;this.dao = new AccountDAOImpl(this.dbc.getConnection()) ;}public boolean doCreate(Account account) throws Exception{				boolean flag = false ;try{if(this.dao.findByAccount(account.getAccount()) == null){flag = this.dao.doCreate(account) ;}}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return flag ;}public String findByAccount(String acname) throws Exception{String password = null ;try{password = this.dao.findByAccount(acname) ;}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return password ;}
}

十一、DAO工厂类DAOFactory:

package factory;import DAO.IAccountDAO;
import DAO.AccountDAOProxy;
import DAO.IUploadFileDAO;
import DAO.UploadFileDAOProxy;public class DAOFactory {public static IAccountDAO getIAccountDAOInstance() throws Exception{  //取得DAO接口实例return new AccountDAOProxy();				//取得代理类实例}public static IUploadFileDAO getIUploadFileDAOInstance() throws Exception{return new UploadFileDAOProxy();}
}

不要问我为什么这么多类这么麻烦。。这是小项目看起来是很麻烦,如果是大项目的话这样就更方便了。

十二、写完这些就可以在RegisterServlet里愉快的注册了:

package servlets;import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;import md5.MD5;
import factory.DAOFactory;
import VO.Account;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class RegisterServlet extends HttpServlet {	//注册账号public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();Account account = new Account() ;account.setAccount(request.getParameter("account"));try {account.setPassword(MD5.generateCode(request.getParameter("password")));} catch (Exception e1) {e1.printStackTrace();}try{if(DAOFactory.getIAccountDAOInstance().doCreate(account)){  //执行添加操作out.print("注册成功!");} else {out.print("该用户已被注册!");}}catch(Exception e){e.printStackTrace() ;out.print("注册失败!");}}
}

十三、这里当向数据库增加一个账号时使用了MD5加密,

这样在数据库中存放的密码就是经过处理的密文,

就算查询数据库看到的密码也是看不懂的乱码。MD5.java:

package md5;import java.security.MessageDigest;public class MD5 {public static String generateCode(String str) throws Exception{    //MD5加密MessageDigest md5 = MessageDigest.getInstance("MD5");byte[] srcBytes = str.getBytes();md5.update(srcBytes);byte[] resultBytes = md5.digest();String result = new String(resultBytes);return result;}
}

以上就能成功地注册了。
既然能注册了,也就能登录了。

十四、现在写LoginServlet:

package servlets;import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import factory.DAOFactory;
import VO.Account;
import md5.MD5;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {    //验证账号密码public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();String account = request.getParameter("account");try {String password = MD5.generateCode(request.getParameter("password"));if(DAOFactory.getIAccountDAOInstance().findByAccount(account).equals(password)){request.getSession().setAttribute("account", account);response.sendRedirect("toIndex.jsp");}else{out.print("账号或密码不正确");}}catch(Exception e){e.printStackTrace() ;out.print("登录错误");}}
}

十五、这里当验证成功时跳转到toIndex:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html><head><meta http-equiv="refresh" content="0;url=index.jsp"> </head><body>正在登录……</body>
</html>

为什么不直接跳到主页呢?因为我在登录页面写了AJAX,使LoginServlet的输出显示在登录页上,比如密码错时就把”账号或密码不正确“显示在登录页。但是登录成功时如果直接跳转到Index.jsp会让首页显示在登录页那里。所以设置一个过渡页面,然后再通过标签跳转到首页。

十六、index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<%@ page import="factory.DAOFactory" %>
<%@ page import="VO.UploadFile" %>
<% request.setCharacterEncoding("utf-8"); %>
<html><head><title>WormJam-首页</title><head><link rel="stylesheet" href="css/style.css" type="text/css"></head></head><body><div class="header"><div class="headerText"><%String account = (String)session.getAttribute("account");out.println("欢迎你," + account);%><a href="loginOut.jsp">退出登录</a></div></div><div class="body"><h1>上传我的源代码</h1><form action="UploadServlet" method="post" enctype="multipart/form-data">选择一个文件:<input type="file" name="myFile"><br>添加描述:<br><textarea rows="3" cols="80" name="text"></textarea><br><input type="submit" value="上传"><a href="myUpload.jsp">我上传的</a></form>${msg }<hr><h1>热门分享</h1><table width="80%"><tr class="title"><td>文件名</td><td>作者</td><td>描述</td><td>下载</td></tr><%List<UploadFile> all = DAOFactory.getIUploadFileDAOInstance().findAll();Iterator<UploadFile> iter = all.iterator();while(iter.hasNext()){UploadFile file = iter.next();out.println("<tr>");out.println("<td>" + file.getFileName() + "</td>");out.println("<td><a href='hisUpload.jsp?account=" + file.getAccount() + "'>" + file.getAccount() + "</td>");out.println("<td>" + file.getDescription() + "</td>");out.println("<td><a href='/WormJam/files/" + file.getFileName() +"'>下载</a>");out.println("<tr>");}%></table></div></body>
</html>

在首页,可以上传文件,然后再热门分享中把所有文件以及上传文件的作者列出来。我这里没有遍历文件夹来列出文件,而是在上传文件的同时记录到数据库。因此还应建立上传文件的DAO类。

十七、VO类UploadFile.java:

package VO;public class UploadFile {	//用户上传文件的类private String account;private String fileName;private String description;public String getAccount(){return account;}public void setAccount(String account){this.account = account;}public String getFileName(){return fileName;}public void setFileName(String fileName){this.fileName = fileName;}public String getDescription(){return description;}public void setDescription(String description){this.description = description;}
}

定义了文件名,作者及描述。

十八、DAO标准类IUploadFileDAO.java:

package DAO;import java.util.* ;
import VO.UploadFile;public interface IUploadFileDAO {public boolean doCreate(UploadFile file) throws Exception;				//写入public List<UploadFile> findByAccount(String account) throws Exception;	//按账号查找文件public List<UploadFile> findAll() throws Exception;						//列出所有文件
}

十九、真实主题实现类UploadFileDAOImpl.java:

package DAO ;import java.util.* ;
import java.sql.* ;import DAO.IUploadFileDAO; 
import VO.UploadFile;public class UploadFileDAOImpl implements IUploadFileDAO {private Connection conn = null;						//数据库连接对象private PreparedStatement pstmt = null;				//数据库操作对象public UploadFileDAOImpl(Connection conn){					//通过构造方法取得数据库连接this.conn = conn;}public boolean doCreate(UploadFile file) throws Exception{ //添加账户boolean flag = false;								//定义标志位String sql = "INSERT INTO FILES(acname,file,descript) VALUES (?,?,?)";this.pstmt = this.conn.prepareStatement(sql);		//实例化PrepareStatement对象this.pstmt.setString(1,file.getAccount());this.pstmt.setString(2,file.getFileName());this.pstmt.setString(3, file.getDescription());if(this.pstmt.executeUpdate() > 0){					//如果有更新操作flag = true ;}this.pstmt.close() ;return flag ;}public List<UploadFile> findByAccount(String acname) throws Exception{//按账号查找密码List<UploadFile> all = new ArrayList<UploadFile>();String sql = "SELECT FILE,descript FROM FILES WHERE acname=?" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setString(1,acname);ResultSet rs = this.pstmt.executeQuery() ;UploadFile file = null;while(rs.next()){file = new UploadFile();file.setFileName(rs.getString(1));file.setDescription(rs.getString(2));all.add(file);}this.pstmt.close();return all;}public List<UploadFile> findAll() throws Exception { //查找所有List<UploadFile> all = new ArrayList<UploadFile>();String sql = "SELECT * FROM FILES";this.pstmt = this.conn.prepareStatement(sql) ;ResultSet rs = this.pstmt.executeQuery() ;UploadFile file = null;while(rs.next()){file = new UploadFile();file.setAccount(rs.getString(1));file.setFileName(rs.getString(2));file.setDescription(rs.getString(3));all.add(file);}this.pstmt.close();return all;}
}

二十、代理主题实现类UploadFileDAOProxy:

package DAO ;import java.util.* ;
import java.sql.* ;import DAO.UploadFileDAOImpl; 
import DAO.IUploadFileDAO;
import dbc.DatabaseConnection;
import VO.UploadFile;public class UploadFileDAOProxy implements IUploadFileDAO {private DatabaseConnection dbc = null ;private IUploadFileDAO dao = null ;public UploadFileDAOProxy() throws Exception {		//在构造方法中实例化连接,同时实例化dao对象this.dbc = new DatabaseConnection() ;this.dao = new UploadFileDAOImpl(this.dbc.getConnection()) ;}public boolean doCreate(UploadFile file) throws Exception{				boolean flag = false ;try{flag = this.dao.doCreate(file) ;}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return flag ;}public List<UploadFile> findByAccount(String acname) throws Exception{List<UploadFile> all = null;try{all = this.dao.findByAccount(acname) ;}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return all ;}public List<UploadFile> findAll() throws Exception{List<UploadFile> all = null;try{all = this.dao.findAll() ;}catch(Exception e){throw e ;}finally{this.dbc.close() ;}return all ;}
}

然后就可以上传文件了,并且上传成功后会把文件名,作者,和描述保存在数据库。上传文件需要用到jsmartcom包,而且我在解决上传的文件名乱码这一块花了很长时间,注意,我的项目里所使用的都是utf-8编码。有些jsmartcom包不支持中文,可以下载到别人改过的支持中文的包。

二十一、上传文件用UploadServlet:

package servlets;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;import factory.DAOFactory;
import VO.UploadFile;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpSession;import com.jspsmart.upload.File;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;public class UploadServlet extends HttpServlet {	//上传文件时的处理public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {UploadFile uploadfile = new UploadFile();HttpSession session = request.getSession();String account = (String)session.getAttribute("account");			//获取session中的用户名uploadfile.setAccount(account);SmartUpload smartUpload = new SmartUpload();ServletConfig config = this.getServletConfig();smartUpload.initialize(config, request, response);		try{smartUpload.upload();String text = smartUpload.getRequest().getParameter("text");uploadfile.setDescription(text);File smartFile = smartUpload.getFiles().getFile(0);String fileName = smartFile.getFileName();smartFile.saveAs("/files/" + fileName,smartUpload.SAVE_VIRTUAL);			request.setAttribute("msg", "上传成功!");uploadfile.setFileName(fileName);DAOFactory.getIUploadFileDAOInstance().doCreate(uploadfile);}catch(SmartUploadException e){request.setAttribute("msg", "上传失败!");e.printStackTrace();			} catch (Exception e) {request.setAttribute("msg", "上传失败!");e.printStackTrace();}RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");rd.forward(request, response);}
}

需注意,session中的用户名是在登录成功时设置的,我用一个session登录验证的过滤器来确保用户只有在登录的时候能够访问主页等页面,不然跳到登录页面:

二十二、LoginFilter:

package filters;import javax.servlet.http.HttpServlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;public class LoginFilter implements Filter {  //登录验证过滤器public void init(FilterConfig config) throws ServletException{}public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{HttpServletRequest req = (HttpServletRequest)request;HttpSession ses = req.getSession();if(ses.getAttribute("account")!=null){chain.doFilter(request, response);}else{request.getRequestDispatcher("login.jsp").forward(request, response);}}public void destroy(){}
}

而点击页面上方的”退出登录“时,就要删除session中的用户,并跳到登录页:

二十三、loginOut.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<% session.removeAttribute("account");response.sendRedirect("login.jsp");
%>

二十四、最后,还有点击”我的上传“和“他的上传”的页面:myUpload.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<%@ page import="factory.DAOFactory" %>
<%@ page import="VO.UploadFile" %>
<% request.setCharacterEncoding("utf-8"); %>
<html><head><title>WormJam-我的上传</title><head><link rel="stylesheet" href="css/style.css" type="text/css"></head></head><body><div class="header"><div class="headerText"><%String account = (String)session.getAttribute("account");out.println("欢迎你," + account);%><a href="loginOut.jsp">退出登录</a><a href="index.jsp">返回首页</a></div></div><div class="body"><h1>我的上传</h1><table width="60%"><tr class="title"><td>文件名</td><td>描述</td><td>下载</td></tr><%List<UploadFile> all = DAOFactory.getIUploadFileDAOInstance().findByAccount(account);Iterator<UploadFile> iter = all.iterator();while(iter.hasNext()){UploadFile file = iter.next();out.println("<tr>");out.println("<td>" + file.getFileName() + "</td>");out.println("<td>" + file.getDescription() + "</td>");out.println("<td><a href='/WormJam/files/" + file.getFileName() +"'>下载</a>");out.println("<tr>");}%></table></div></body>
</html>

hisUpload.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<%@ page import="factory.DAOFactory" %>
<%@ page import="VO.UploadFile" %>
<% request.setCharacterEncoding("utf-8"); %>
<html><head><title>WormJam-他的上传</title><head><link rel="stylesheet" href="css/style.css" type="text/css"></head></head><body><div class="header"><div class="headerText"><%String account = (String)session.getAttribute("account");out.println("欢迎你," + account);String acname = request.getParameter("account");%><a href="loginOut.jsp">退出登录</a><a href="index.jsp">返回首页</a></div></div><div class="body"><h1><%= acname + "的上传" %></h1><table width="60%"><tr class="title"><td>文件名</td><td>描述</td><td>下载</td></tr><%List<UploadFile> all = DAOFactory.getIUploadFileDAOInstance().findByAccount(acname);Iterator<UploadFile> iter = all.iterator();while(iter.hasNext()){UploadFile file = iter.next();out.println("<tr>");out.println("<td>" + file.getFileName() + "</td>");out.println("<td>" + file.getDescription() + "</td>");out.println("<td><a href='/WormJam/files/" + file.getFileName() +"'>下载</a>");out.println("<tr>");}%></table></div></body>
</html>

最后补充一点,点击下载时会新开一个页面显示文件的内容,而右键“下载”点击“链接另存为”时才会下载,特别是如果文件是zip等不能查看的类型就会出错。也有使点击就能下载的方法,我比较懒就没去试了。

转载自原创:https://blog.csdn.net/u012077155/article/details/43115507


  1. x00-x7f ↩︎


http://chatgpt.dhexx.cn/article/L1rQhvNH.shtml

相关文章

java小项目水果摊

介绍 刚学完java 集合和IO流&#xff0c;想做了一个简单的小项目来练手&#xff0c;于是我就运用一些基础知识做了这个水果摊。水果摊的主要功能有&#xff1a; 进货查看水果列表购买水果查看购物车结账退出 都是一些简单的功能&#xff0c;下面就来展示代码&#xff1b; …

Java个人Web小项目

JavaWeb-HTML实列开发 目录源代码链接部分效果图 目录 #1.用户列表开发 新建一个Maven项目 创建包&#xff1a;com.iflytek 在项目中 在com.iflytek.controller中新建一个类为控制器类&#xff1a;(本网址为/UserController.java) UserController.java package com.iflytek…

Java小项目(一)---超市管理系统

超市管理系统 一、使用技术二、实现功能三、运行效果图3.1 货物清单3.2 增加货物3.3 删除货物3.4 修改货物3.5 退出 四、实现的代码4.1 Good商品货物类4.2 ShoppingSystem超市管理系统测试类 一、使用技术 Java SE 二、实现功能 使用选择结构&#xff0c;循环结构&#xff0…

Java小项目另一个水果摊

文章目录 前言一、包和表截图二、源代码1.JDBC连接Mysql数据管理员界面&#xff1a;增删查改用户界面 &#xff1a;查找水果建立断开连接 2.GUI窗口界面开始选择界面用户购买水果界面管理员登录界面管理员界面 3.水果属性4.main方法 总结拒绝白嫖&#xff0c;给个三连鼓励一下吧…

JavaWeb之综合小项目

案例需求&#xff1a; 使用Java程序操作数据库&#xff0c;并把结果显示在jsp页面上。 &#xff08;这里只做查询操作&#xff0c;增删改操作类似如此&#xff09; 使用工具&#xff1a; maven&#xff0c;idea&#xff0c;tomcat&#xff0c;MySQL数据库。 使用技术&#xff1…

20个Java小项目,献给嗜学如狂的人,拿来练练手

给大家推荐一条由浅入深的JAVA学习路径&#xff0c;首先完成 Java基础、JDK、JDBC、正则表达式等基础实验&#xff0c;然后进阶到 J2SE 和 SSH 框架学习。最后再通过有趣的练手项目进行巩固。 JAVA基础 1. Java编程语言&#xff08;新版&#xff09; 2. Java进阶之设计模式…

Java面试:java小项目实例

前言 本人是底层 211 本科,刚毕业,⽆科研经历,但是有些项⽬经历。 在国内监控行业某头部企业做过一段时间的实习。 想着投下字节,可以积累⼀下⾯试经验和为金九银十面招做准备。投了简历之后,过了一段时 间,HR 就打电话跟我约时间, 说明一下,我投的是北京 office。 以下就是一…

java 练手小项目

学习了javaSE的基础&#xff0c;为了巩固对Java面向对象编程&#xff0c;以及java多线程编程的理解&#xff0c;使用swing 写了一个很简单的小项目&#xff0c;源码github地址: https://github.com/pythondever/swing-demo 喜欢的同学可以学习学习 整体代码流程 * 1. JFra…

javaWeb小项目

作为一个学习加Java的小白&#xff0c;非常开心能记录下自己的成长历程。技术有限&#xff0c;请见谅&#xff01; 我主要学习的是Java后端&#xff0c;当我学着做了一个web小项目之后对javaee项目也有了初步见解&#xff01; 老师说万物皆对象&#xff0c;万物皆增删改查。我的…

java练习小项目(一)

学习java有一段时间了&#xff0c;都是处于那种三天打鱼&#xff0c;两天晒网的状态&#xff0c;没有效率&#xff0c;因为方法不对&#xff0c;一直是在看资料&#xff0c;看视频&#xff0c;并没有实际上手项目&#xff0c;就算当时看了&#xff0c;记住了&#xff0c;最后还…

适合Java新手练手的小项目!

对于很多朋友来说&#xff0c;Java是学习编程的开始&#xff0c;也有很多朋友希望通过Java可以找到工作&#xff0c;那么当我们学习了Java的基础知识之后&#xff0c;我们急需要一些项目去帮我们整理一下自己学习的知识点以及提高一下编程能力&#xff0c;对小的工程有一个大致…

Java小项目谁看谁都会(图书管理)

在我之前的几篇博客中对于Java语法&#xff0c;思想等等进行了总结&#xff0c;但是还是差点那味&#xff0c;就是没有将这些知识串起来那么今天的这篇博客我就将Java中&#xff1a;类 对象 封装 继承 多态 抽象类 接口等等知识共同使用完成一个Java的小项目一起来看 介绍 我…

推荐几个适合新手的Java练手项目(好玩又有趣)

Java练手项目第一波 一、坦克大战 链接&#xff1a;https://www.bilibili.com/video/BV1zP4y1b7gw/?spm_id_from333.337.search-card.all.click Java练手小项目&#xff0c;熟练掌握面向对象编程思想、对象池的使用、IO流、多线程、GUI等基础。 二、贪吃蛇 链接&#xff1a;ht…

10个优质的Java练手项目

10个优质的Java练手项目 最近有很多小伙伴私信我说推荐几个毕设项目&#xff0c;还有就是学了Java有一段时间了&#xff0c;想找几个项目想练练手&#xff0c;在面试的时候也可以增加一点项目经验。 在这里我收集了10个可以直接导入运行的项目。 由简单到复杂&#xff0c;分别…

JAVA小项目(一)——一个简单的记帐本【轻松入门,附源码】

目录 1. 实现效果 2.项目架构 3. 细节代码实现 &#x1f31e;哈喽&#xff0c;大家好丫&#xff0c;你们的小郭子又来啦 ~ &#x1f31e;今天我们用java来写一个简单的小项目——【记账本】&#xff0c;嘿嘿 话不多说&#xff0c;直接上干货&#xff0c; 1. 实现效果 2.项目…

【目标定位】基于matlab TDOA GPS混合定位【含Matlab源码 2310期】

⛄一、基于粒子滤波污染源定位简介 1 混合定位的系统结构 本文提出的GPS/TDOA混合定位系统结构可见于图1。 移动终端集成了无线通信模块和GPS接收模块,终端可同时测得通信网络中相对于服务基站的TDOA和GPS卫星到终端的伪距。在CDMA通信系统中,从通信终端测量TDOA的具体方法和…

基于图像的目标检测与定位方法概述

目录 1. 目标检测与定位概念2. 目标检测与定位方法2.1 传统目标检测流程2.2 two-stage检测算法2.2.1 R-CNN2.2.2 two-stage其他算法2.2.2.1 Spatial Pyramid Pooling&#xff08;空间金字塔池化&#xff09;2.2.2.2 Fast-RCNN2.2.2.3 P11 Faster RCNN 2.3 One-Stage2.3.1 YOLO2…

大疆无人机实现目标定位

大疆无人机实现目标定位 大疆无人机回传的实时视频可以帮助飞友观察发现美景&#xff0c;就称为目标吧&#xff0c;你偏偏对目标很感兴趣&#xff0c;迫切想知道目标的位置&#xff0c;最好是经纬度坐标。你查找大疆Document&#xff0c;欣喜地发现大疆提供了定位机体本身的定…

2-基于单目视觉的目标定位

1-四种坐标系描述 一、世界坐标系 客观三维世界的绝对坐标系&#xff0c;也称客观世界坐标系&#xff0c;是以目标为原点建立起来的坐标系。 二、摄像机坐标系 摄像机坐标系是以摄像机的光心作为坐标系的原点&#xff0c;&#xff3a;c&#xff0e;轴与光轴重合&#xff0c;并…

复杂情况下,目标区域定位

复杂情况下&#xff0c;基于halcon的目标区域定位 原始图源代码处理结果 原始图 源代码 dev_close_window () read_image (Image, E:/Halcon_Learn/黑块提取_网络/1.bmp) get_image_size (Image, Width, Height) dev_open_window_fit_size (0, 0, Width, Height, -1, -1, Wind…