Java实践之路——jsp+servelt+javabean

本文作者分享了通过jsp、Servlet和JavaBean实现一个基础的Java登录程序的过程,涉及Ajax、jdbc、MySQL数据库以及Tomcat6或Jboss6服务器的使用。在开发中遇到了Resultset为空、PreparedStatement查询出错、中文乱码等问题,并对系统扩展性和维护性提出了思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        好久都没有写java程序了。其实一直都没有好好的,系统的学习或者说写过java程序。看看java日新月异的发展,看看一个个牛逼的java牛人,我这个底端的程序员也跟着学学吧。

       毕业来,在公司做的项目都是用Dotnet做的。以至于一直比较喜欢java的我,最终还是走上了与自己背道而驰的道路。其实java和Dotnet相比,哪个更好,网上讨论得异常的激烈,还要拉帮结派。其实我也不知道哪个好,可能觉得Dotnet的平台比较方便,而且更容易快速开发,所以就选择了Dotnet。对于java,始终有一种敬而远之的感觉。喜欢却不敢碰,总觉得相对繁琐,迟迟不敢下手。哈哈,现在不管了。打算系统的学习学习 ,在这里记录一下过程,希望能起个监督自己的作用,也做个备忘录吧。如果能对后人带来点好处,那不甚欢喜。

     

      好了,闲话少说,进入正题。

 

     其实,学习java具体有个什么流程,我也搞不清楚。说是说系统的学习,也只能凭借自己的感觉走了(嘿嘿,还是在网上找过一些资料滴)。根据自己以前学的java,零零碎碎的,就先从jsp+servlet+javabean开始吧。其实这个三个是java的基本技术了,很多插件和框架都是从这些基础发展而来的。比如说struts和spring等。servlet还是个好东西滴。在这里写一个基本的登录程序。用到的技术有jsp、servlet、javabean、ajax、jdbc,采用的数据库为mysql,其中javascript用的jquery。服务器采用tomcat6或者jboss6,呵呵,感觉挺多了,不过都是浅显的东西。

    流程为:输入用户名和密码->判断是否正确,正确->进入主页,错误->跳转错误信息页面。进入主页可以新增用户。

    数据库名为mydb,创建一个表user,脚本为

create database mydb;
use mydb;
create table user(
      name varchar(20) not null primary key,
      password varchar(15) not null);

 

   整个项目的文档架构图如下

 

   先写后天代码吧,按顺序来,现实entity中的User.java,一个普通的实体bean

package entity;

public class User{
	private String username;
	private String password;
	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 User(){}
	
	public User(String username,String password){
		this.username=username;
		this.password=password;
	}
}


这段代码就不多说了,就是一个数据库表user的映射

 

下面是数据库操作类,db中的MySqlDb,java,其中定义了操作mysql的常用方法CURD

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MySqlDb {
	private String connStr="jdbc:mysql://localhost/mydb?user=root&password=123&useUnicode=true&characterEncoding=GBK";
	private Connection conn=null;
	private Statement stm=null;
	private PreparedStatement pstm=null;
	
	public MySqlDb()
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
		}
		catch(ClassNotFoundException ex)
		{
			ex.printStackTrace();
		}
		
		try {
			conn=DriverManager.getConnection(connStr);
			stm=conn.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	public ResultSet query(String sql)
	{
		ResultSet rs=null;
		
		try {
			rs = stm.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		finally
		{
//			try {
//				this.stm.close();
//				this.conn.close();
//			} catch (SQLException e) {
//				e.printStackTrace();
//			}
		}
		return rs;
	}
	
	public int execute(String sql)
	{
		try {
			return stm.executeUpdate(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		finally
		{
			try {
				this.stm.close();
				this.conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return -1;
	}
	
	public ResultSet preQuery(String sql,Object...params)
	{
		ResultSet rs=null;
		
		try {
			this.pstm=conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++)
			{
				this.pstm.setObject(i+1, params[i]);
			}
			rs=pstm.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		finally
		{
			try {
				this.pstm.close();
				this.conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return rs;
	}
	
	public int preExecute(String sql,Object...params)
	{
		
		try {
			this.pstm=conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++)
			{
				this.pstm.setObject(i+1, params[i]);
			}
			return this.pstm.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		finally
		{
			try {
				this.pstm.close();
				this.conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return -1;
	}
}


上面注释部分,我不知道为什么关闭了连接和stm后,返回的rs是空的??

 

接下来是dao下面的IUserDao.java,这是一个借口,其中定义了一些数据访问的规范,代码如下

package dao;

import java.util.List;

import entity.User;

public interface IUserDao {
	Boolean exsit(User user);
	List getAllUsers();
	Boolean saveUser(User user);
	Boolean deleteUser(String name);
	Boolean UpdateUser(User user);
}


接下来是包dao.jdbc.impl中的UserDaoImpl.java了,这里定义了mysql的数据访问方式

package dao.jdbc.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.IUserDao;
import db.MySqlDb;
import entity.User;

public class UserDaoImpl implements IUserDao {

	private MySqlDb db=null;
	
	public UserDaoImpl()
	{
		this.db=new MySqlDb();
	}
	
	public Boolean deleteUser(String name) {
		String sql="delete from user where name ='"+name+"'";
		
		if(db.execute(sql)>0)
		{
			return true;
		}
		return false;
	}

	public List<User> getAllUsers() {
		List<User> users=null;
		
		users=new ArrayList<User>();
		String sql="select * from user";
		ResultSet rs=db.query(sql);
		try {
			while(rs.next())
			{
				User user=new User();
				user.setUsername(rs.getString("name"));
				user.setPassword(rs.getString("password"));
				users.add(user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return users;
	}

	public Boolean exsit(User user) {
		if(user==null)
		{
			return false;
		}
//		String sql="select * from user where name=? and password=?";
//		ResultSet rs=db.preQuery(sql, user.getUsername(),user.getPassword());
		String sql="select * from user where name='"+user.getUsername()+"' and password='"+user.getPassword()+"'";
		ResultSet rs=db.query(sql);
		try {
			while(rs.next())
			{
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	public Boolean saveUser(User user) {
		
		if(user==null)
		{
			return false;
		}
		String sql="Insert into user(name,password) values(?,?)";
		
		if(db.preExecute(sql, user.getUsername(),user.getPassword())>0)
		{
			return true;
		}
		
		return false;
	}

	public Boolean UpdateUser(User user) {
		if(user==null)
		{
			return false;
		}
		
		if(!this.exsit(user))
		{
			return false;
		}
		
		String sql="Update user set password=? where name=?";
		
		if(db.preExecute(sql, user.getPassword(),user.getUsername())>0)
		{
			return true;
		}
		return false;
		
	}

}


这里的途中注释部分也是比较纳闷的一点,不知道为什么用PreparedStatement之行查询为什么不行??

 

接下来是bean里面的UserBean.java了,这里定义了业务逻辑

package bean;

import java.util.List;

import dao.IUserDao;
import dao.jdbc.impl.UserDaoImpl;
import entity.User;

public class UserBean {
	private User user;
	private IUserDao dao;
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	public UserBean(){}
	
	public UserBean(User user)
	{
		this.user=user;
	}
	
	public Boolean IsLogin()
	{
		if(this.user==null)
		{
			return false;
		}
		
		if(this.exsit())
		{
			return true;
		}
		return false;
	}
	
	public Boolean saveUser()
	{
		if(this.user==null)
		{
			return false;
		}
		dao=new UserDaoImpl();
		
		return dao.saveUser(user);
	}
	
	public Boolean deleteUser()
	{
		if(this.user==null)
		{
			return false;
		}
		dao=new UserDaoImpl();
		
		return dao.deleteUser(user.getUsername());
	}
	
	public Boolean updateUser()
	{
		if(this.user==null)
		{
			return false;
		}
		dao=new UserDaoImpl();
		
		return dao.UpdateUser(this.user);
	}
	
	public Boolean exsit()
	{
		if(this.user==null)
		{
			return false;
		}
		dao=new UserDaoImpl();
		
		return dao.exsit(user);
	}
	
	public List<User> getAllUsers()
	{
		dao=new UserDaoImpl();
		return dao.getAllUsers();
	}
}


然后是service里面得UserService.java,这里集中定义了User的ajax请求服务

 

package service;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import bean.UserBean;
import entity.User;

public class UserService {
	private HttpServletRequest req;
	private HttpServletResponse res;
	
	public HttpServletRequest getReq() {
		return req;
	}

	public void setReq(HttpServletRequest req) {
		this.req = req;
	}

	public HttpServletResponse getRes() {
		return res;
	}

	public void setRes(HttpServletResponse res) {
		this.res = res;
	}

	public UserService()
	{
		
	}
	
	public UserService(HttpServletRequest req,HttpServletResponse res)
	{
		this.req=req;
		this.res=res;
	}
	
	public void login(String name,String password)
	{
		User user=new User(name,password);
		UserBean bean=new UserBean(user);
		
		if (bean.exsit()) {
			try {
				req.getRequestDispatcher("index.jsp").forward(req, res);
			} catch (ServletException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			
			req.setAttribute("errorInfo", "username or password is not correctly");
			try {
				req.getRequestDispatcher("error.jsp").forward(req, res);
			} catch (ServletException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void getUsers()
	{
		UserBean bean=new UserBean();
		List<User> users=bean.getAllUsers();
		String result="[";
		
		for(User user:users)
		{
			result+="{'name':'"+user.getUsername()+"','password':'"+user.getPassword()+"'},";
		}
		result=result.substring(0, result.length()-1);
		result+="]";
		
		PrintWriter out;
		try {
			out = this.res.getWriter();
			out.print(result);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void addUser(String username,String password)
	{
		User user=new User(username,password);
		
		UserBean bean=new UserBean(user);
		String result="";
		
		if(bean.saveUser())
		{
			result="success";
		}
		else
		{
			result="add user failed";
		}
		
		PrintWriter out;
		try {
			out = this.res.getWriter();
			out.print(result);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

这里把所有的请求处理集中到service中,这里提供了是三个服务,判断登陆、获取所有用户和新增用户。其中的乱码是中文,就是往errorInfo中添加一些错误提示(到乱码就显示不下去了,只好改成英文,哎……)

 下面就是servlet中的UserServlet.java了,这里定义了请求的处理

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import service.UserService;

public class UserServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private UserService service;
	
	public UserServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); 
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		service=new UserService(request,response);
		
		String action="";
		action=request.getParameter("action");
		
		if(action==null || action.equals(""))
		{
			return;
		}
		//�������������
		if(action.toUpperCase().equals("CHECK_LOGIN"))
		{
			String name=request.getParameter("username");
			String password=request.getParameter("password");
			service.login(name, password);
		}
		else if(action.toUpperCase().equals("GETUSERS"))
		{
			service.getUsers();
		}
		else if(action.toUpperCase().equals("ADDUSER"))
		{
			String name=request.getParameter("name");
			String password=request.getParameter("password");
			
			service.addUser(name,password);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request,response);
	}

	public void init() throws ServletException {
		
	}

}

这里定义了一个action,根据客户端的请求来分发到不同的服务进行处理


全部采用doGet的模式处理,servlet需要在web.xml中进行配置

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	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_2_5.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>servlet.UserServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/UserServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>


 

最后来写表现层的代码吧,现实login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>Login Page</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		
		<link rel="stylesheet" type="text/css" href="styles/main.css">
		<script src="scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
		
		<script type="text/javascript">
			function valid()
			{
				$("#error").empty();
				
				var username=$("#username").val();
				var password=$("#password").val();
				
				var msg="";
				
				if(username=='')
				{
					msg+="username should not be empty"				
				}
				else if(username.length<4)
				{
					//msg+="username length should contain four character at least";
				}
				
				if(password=='')
				{
					msg+="<br/>password should not be null";
				}
				else if(password.length<6)
				{
					msg+="<br />password length should contain six character at least";
				}
				
				if(msg!="")
				{
					//alert(msg);
					$("#error").append("*" + msg);
					return false;
				}
				
				return true;
			}
		</script>
	</head>

	<body>
		<div style="width:500px; height:50px; margin-left:300px;margin-top:100px;border:1px solid red;">
			<form action="UserServlet" method="POST">
				<span class="tip1">用户名:</span>
				<span class="tip2"><input type="text" id="username" name="username" class="value1"/></span>
				<br />
				<span class="tip1">密码:</span>
				<span class="tip2"><input type="password" id="password" name="password" class="value1"/></span>
				<br />
				<span class="hide"><input type="text" id="action" name="action" value="CHECK_LOGIN"/></span>
				<span class="commit"><input type="submit" value="commit" onclick=" return valid();"/></span>
			</form>
			
			<div id="error" style="color:red;"></div>

		</div>
	</body>
</html>

这里是登陆的入口


然后是index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script src="scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script type="text/javascript">

	var user_num=0;
	
	$(document).ready(function()
	{
		//$("#getMessage").bind("click",getMessage);
		setUserList();
	});
	
	function setUserList()
	{
		$.get("UserServlet",{action:"GETUSERS"},function(data){
			var content='';
			//var temp='[{"name":"admin","password":"123456"},{"name":"admin2","password":"1234563"}]';
			var users=eval(data);
			user_num=users.length;
			$.each(users,function(n,user){
				content+='<div id="user'+(n+1)+'">username:'+user.name+',password:'+user.password+'</div>';
			});
			$("#userlist").append(content);
		});
	}
	
	function newUser()
	{
		var username=$("#username").val();
		var pwd=$("#password").val();
		$.get("UserServlet",{action:"ADDUSER",name:username,password:pwd},function(data){
			if(data=="success")
			{
				user_num++;
				var content='<div id="user'+user_num+'">username:'+username+',password:'+pwd+'</div>';
				$("#userlist").append(content);
			}
			else
			{
				alert(data);
			}
		});
		
	}
</script>
</head>
<body>
	欢迎你,<%= request.getParameter("username") %><br/>
	
	用户列表
	<div id="userlist">
		
	</div>
	<div><input type="button" value="new" onclick="newUser();"/></div>
	<div id="new_user">
		<span>username:<input type="text" id="username" name="username"/></span><br/>
		<span>password:<input type="password" id="password" name="password"/></span>
	</div>
</body>
</html>

这里提供了新增用户的入口


最后是错误信息页面error.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>ErrorPage</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <%=request.getAttribute("errorInfo") %>
  </body>
</html>


显示错误信息

 

遇到的问题总结

1、为什么在查询完后关闭连接和stm后返回的Resultset为空

2、为什么在使用PreparedStatement查询时出错

3、在页面请求中,输入中文时出现乱码,如何解决

4、在项目架构上,如何使得系统更具扩展性和维护性,如何使得系统更加健壮高效,有待进一步研究学习

 

 

好,到这里就基本上完了。代码贴得有点多。因为比较简单,所以讲解的较少。写的注释有点少,不过好在没写,不然中文全成乱码 了。有任何问题,欢迎交流学习。

 

图片没有上传成功,后面补上,最近博客更新,导致一些功能的失常,还是希望CSDN加快处理啊(好怕一下就把我写的东西全丢了!)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值