1. 程式人生 > >web開發學生資訊管理系統

web開發學生資訊管理系統

    開發前需要的工具要準備好,我使用的是myeclipse來做的開發,也可以使用eclipse,但需要安裝外掛,伺服器使用Tomcat7.0,資料庫使用mysql,資料庫圖形化介面使用navicat,開發中需要的jar包如下:struts的一些核心jar包(可以到struts官網去下載),hibernate的jar包,在hibernate官網下載後解壓出其lib目錄下required中的jar包,還需要連線資料庫的jar包,和開發中做測試的junit的jar包。

    首先,我們建立一個web專案,將我們提取準備好的jar包匯入專案的WEB-INF目錄下的lib資料夾,然後通過右鍵專案,選擇build path方式來將jar新增到專案中來;

在web.xml中新增過濾器和對映如下,如何確定輸入的過濾器正確,可以通過按住ctrl和滑鼠移到filter-class值dispatcher.ng上,有變化說明是正確的;

<filter>
     <filter-name>struts2</filter-name>
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>

    接著在src中新增struts.xml檔案,該檔案可以在strust官網下的空白專案中找到,直接粘過來即可。

<package name="users" namespace="/users" extends="struts-default">
     	<action name="*_*" class="action.{1}Action" method="{2}">
     		<result name="login_success">/users/Users_login_success.jsp</result>
     		<result name="login_failure">/users/Users_login.jsp</result>
     		<result name="logout_success">/users/Users_login.jsp</result>
     		<result name="input">/users/Users_login.jsp</result><!--注意加上這句,不然表單驗證會出錯  -->
     	</action>
     	
</package>
<package name="students" namespace="/students" extends="struts-default">
     	<action name="*_*" class="action.{1}Action" method="{2}">
     		<result name="query_success">/students/Students_query_success.jsp</result>
     		<result name="delete_success" type="chain">Students_query</result>
     		<result name="add_success">/students/Students_add_success.jsp</result>
     		<result name="modify_success">/students/Students_modify.jsp</result>
     		<result name="find_success">/students/Students_modify.jsp</result>
     		<result name="save_success">/students/Students_modify_success.jsp</result>
     	</action>
</package>

action的名稱是通過萬用字元*來表示的,例如action名為Student_query,則class為StudentAction,方法名為query;

其次加入hibernate.cfg.xml檔案,配置資訊如下

<session-factory>
		<property name="connection.username">root</property>
		<property name="connection.password">123123</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="connection.url">
			jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8
		</property>
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<property name="hbm2ddl.auto">update</property>
		<property name="hibernate.current_session_context_class">
			thread
		</property>
		<mapping resource="entity/Students.hbm.xml" />
		<mapping resource="entity/Users.hbm.xml" />
	</session-factory>

root為使用者名稱,123123為登入密碼,test為連線的資料庫名.mapping 是對映的實體資料型別,

新建一個entity包,建立兩個實體類,Students和Users,Students 私有屬性:sid,sname,gender,birthday,address;Users 私有屬性:uid,username,password

利用原始碼生成set/get方法和帶引數和不帶引數的構造方法,接著在entity中建立Students.hbm.xml和Users.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="entity.Students" table="STUDENTS">

        <id name="sid" type="java.lang.String" length="8">
            <generator class="assigned"/>
        </id>
        <property name="sname" type="java.lang.String"/>
		<property name="gender" type="java.lang.String"/>
		<property name="birthday" type="date"/>
		<property name="address" type="java.lang.String"/>
    </class>

</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="entity.Users" table="USERS">

        <id name="uid" type="int">
            <generator class="native"/>
        </id>
        <property name="username" type="java.lang.String"/>
		<property name="password" type="java.lang.String"/>
    </class>

</hibernate-mapping>
generator值為native是自動增加的方式,assigned不是自動增加;

此時我們新建一個資料夾Test,建立一個entity包,新建一個測試類TestStudent,新增測試方法testSaveStudents()

@Test
	public void testSaveStudents(){
		//建立配置物件
		Configuration config=new Configuration().configure();
		//建立服務註冊物件
		ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
		//建立sessionFactory
		SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
		//建立session物件
		Session session=sessionFactory.getCurrentSession();
		//建立事務物件
		Transaction tx=session.beginTransaction();
		Students s1=new Students("001","無忌","男",new Date(),"武當");
		Students s2=new Students("002","夜華","男",new Date(),"天族");
		Students s3=new Students("003","白淺","女",new Date(),"青丘");
		session.save(s1);
		session.save(s2);
		session.save(s3);
		tx.commit();
		sessionFactory.close();
	}

開啟資料庫發現測試方法儲存了三位同學的資訊;我們發現在進行資料庫操作前需要建立配置物件,服務註冊物件很是麻煩,所以我們在src資料夾下建立一個db包,建立hibernate會話工廠來建立配置物件和服務註冊物件;

public class MyHibernateSessionFactory {

	private static SessionFactory sessionFactory;
	//構造方法私有化,保證單例模式
	private MyHibernateSessionFactory(){
		
	}
	//公有的靜態方法,獲得會話工廠物件
	public static SessionFactory getSessionFactory(){
		if(sessionFactory==null){
			Configuration config=new Configuration().configure();//建立配置物件
			ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().
					applySettings(config.getProperties()).buildServiceRegistry();//建立服務註冊物件
			sessionFactory=config.buildSessionFactory(serviceRegistry);
			return sessionFactory;
			
			
		}else{
			return sessionFactory;
		}
	}
}

建立service和service.impl包,在service包下新建介面StudentsDAO和UsersDAO

//學生業務邏輯介面
public interface StudentsDAO {

	//查詢所有學生資料
	public List<Students> queryAllStudents();
	
	//根據學生編號查詢學生資料
	public Students queryStudentsById(String id);
	
	//新增學生資料
	public boolean addStudents(Students s);
	
	//修改學生資料
	public boolean updateStudents(Students s);
	
	//刪除學生資料
	public boolean deleteStudents(String id);

//使用者業務邏輯介面
public interface UsersDAO {

	//使用者登入方法
	public boolean usersLogin(Users u);
緊接著在service.impl包下建立介面StudentsDAO的實現類StudentsDAOImpl,建立UsersDAO的實現類UsersDAOImpl
public class StudentsDAOImpl implements StudentsDAO{

	//查詢所有學生資料
	public List<Students> queryAllStudents() {
		
		Transaction tx=null;
		List<Students> list=null;
		String hql="";
		try{
			Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
			session.beginTransaction();//開啟事務
			hql="from Students";
			Query query=session.createQuery(hql);
			list=query.list();
			session.close();//記得關閉事務
			return list;
		}catch(Exception ex)
		{
			ex.printStackTrace();
			tx.rollback();
			return list;
			
		}finally{
			if(tx!=null){
				tx=null;
			}
		}
	}

	//根據學號查詢學生資料
	public Students queryStudentsById(String sid) {
		
		Transaction tx=null;
		Students s=null;
		try{
			Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
			tx=session.beginTransaction();//開啟事務
			s=(Students)session.get(Students.class, sid);
			tx.commit();
			
			return s;
		}catch(Exception ex)
		{
			ex.printStackTrace();
			tx.rollback();
			return s;
			
		}finally{
			if(tx!=null){
				tx=null;
			}
			
		}
	}

	//增加學生資料
	public boolean addStudents(Students s) {
		
		s.setSid(getNewSid());
		Transaction tx=null;
		try{
			Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
			tx=session.beginTransaction();
			session.save(s);
			tx.commit();//事務提交
			return true;
		}catch(Exception ex){
			ex.printStackTrace();
			tx.rollback();//事務回滾
			return false;
		}finally{
			
			if(tx!=null){
				tx=null;
			}
		}
	}

	//更新學生資料
	public boolean updateStudents(Students s) {
		
		Transaction tx=null;
		
		try{
			Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
			tx=session.beginTransaction();
			session.update(s);
			tx.commit();//事務提交
			
			return true;
		}catch(Exception ex){
			ex.printStackTrace();
			tx.rollback();//事務回滾
			return false;
		}finally{
			
			if(tx!=null){
				tx=null;
			}
		}
	}

	//刪除學生資料
	public boolean deleteStudents(String id) {
		Transaction tx=null;
		//String hql="";
		try{
			Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
			tx=session.beginTransaction();
			Students s=(Students)session.get(Students.class, id);
			session.delete(s);
			tx.commit();
			return true;
			
		}catch(Exception ex){
			ex.printStackTrace();
			tx.rollback();
			return false;
		}finally{
			if(tx!=null){
				tx=null;
			}
		}
		
	}
	//生成學生的學號
	public String getNewSid(){
		Transaction tx=null;
		String hql="";
		String sid=null;
		try{
			Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
			tx=session.beginTransaction();
			//獲得當前學生的最大編號
			hql="select max(sid) from Students";
			Query query=session.createQuery(hql);
			sid=(String)query.uniqueResult();
			if(sid==null||"".equals(sid)){
				//給一個預設的最大編號
				sid="001";
			}else{
				//String temp=sid.substring(1);//取後七位
				String temp="";
				int i=Integer.parseInt(sid);//轉為數字
				i++;
				//再還原為字串
				temp=String.valueOf(i);
				int len=temp.length();
				//湊夠三位
				for(int j=0;j<3-len;j++){
					temp="0"+temp;
				}
				//sid="s"+temp;
				sid=temp;
			}
	
			tx.commit();
			return sid;
		}catch(Exception ex){
			ex.printStackTrace();
			tx.rollback();
			return null;
		}finally{
			if(tx!=null){
				tx=null;
			}
		}
	}
}
public boolean usersLogin(Users u) {
	
		//事務物件
		Transaction tx=null;
		String hql="";
		try{
			Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
			tx=session.beginTransaction();
			hql="from Users where username=? and password=?";
			Query query=session.createQuery(hql);
			query.setParameter(0, u.getUsername());
			query.setParameter(1, u.getPassword());
			List list=query.list();
			tx.commit();//提交事務
			if(list.size()>0){
				return true;
			}else{
				return false;
			}
				
		}catch(Exception ex){
			ex.printStackTrace();
			return false;
		}finally{
			if(tx!=null){
				//tx.commit();
				tx=null;
			}
		}
		
	}

	
}
注意:事務開啟了完成操作後要將事務提交,出錯要回滾,不然會出現事務巢狀的錯誤。

建立action包,新建SuperAction,UsersAction和StudentsAction三個類,
//所有Action動作的父類物件
public class SuperAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	protected HttpServletRequest request;//請求物件
	protected HttpServletResponse response;//響應物件
	protected HttpSession session;//會話物件
	protected ServletContext application;//全域性物件
	
	public void setServletContext(ServletContext application) {
		// TODO Auto-generated method stub
		this.application=application;
	}

	@Override
	public void setServletResponse(HttpServletResponse response) {
		// TODO Auto-generated method stub
		this.response=response;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		this.request=request;
		this.session=this.request.getSession();
	}

	
}

//學生Action類
public class StudentsAction extends SuperAction{

	//查詢所有學生動作
	public String query(){
		StudentsDAO sdao=new StudentsDAOImpl();
		List<Students> list=sdao.queryAllStudents();
		//放進session中
		if(list!=null&&list.size()>0){
			session.setAttribute("students_list", list);
			//return "Students_query_success";
		}
		return "query_success";
	}
	//刪除學生動作
	public String delete(){
		StudentsDAO sdao=new StudentsDAOImpl();
		String sid=request.getParameter("sid");
		sdao.deleteStudents(sid);
		return "delete_success";
		
	}
	//新增學生
	public String add() throws Exception{
		Students s=new Students();
		s.setSname(request.getParameter("sname"));
		s.setGender(request.getParameter("gender"));
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		s.setBirthday(sdf.parse(request.getParameter("birthday")));
		s.setAddress(request.getParameter("address"));
		StudentsDAO sdao=new StudentsDAOImpl();
		sdao.addStudents(s);
		return "add_success";
		
	}
	//修改學生資訊動作
	public String modify(){
		
		//獲得傳遞過來的學生編號
		String sid=request.getParameter("sid");
		StudentsDAO sdao=new StudentsDAOImpl();
		Students s=sdao.queryStudentsById(sid);
		//儲存在會話中
		session.setAttribute("modify_students",s);
		return "modify_success";
	}
	//儲存修改學生資訊動作
	public String save() throws Exception{
		Students s=new Students();
		s.setSid(request.getParameter("sid"));
		s.setSname(request.getParameter("sname"));
		s.setGender(request.getParameter("gender"));
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		s.setBirthday(sdf.parse(request.getParameter("birthday")));
		s.setAddress(request.getParameter("address"));
		StudentsDAO sdao=new StudentsDAOImpl();
		sdao.updateStudents(s);
		return "save_success";
	}
	public String find(){
		String sid=request.getParameter("sid");
		StudentsDAO sdao=new StudentsDAOImpl();
		Students s=sdao.queryStudentsById(sid);
		//儲存到會話中
		session.setAttribute("modify_students", s);
		return "find_success";
	}
}

public class UsersAction extends SuperAction implements ModelDriven<Users>{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Users user=new Users();
	//使用者登入動作
	public String login(){
		UsersDAO udao=new UsersDAOImpl();
		if(udao.usersLogin(user)){
			//在session中儲存登入成功的使用者名稱
			session.setAttribute("loginUserName", user.getUsername());
			return "login_success";
		}else{
			return "login_failure";
		}
	}
	//使用者登出功能
	@SkipValidation
	public String logout(){
		if(session.getAttribute("loginUserName")!=null){
			session.removeAttribute("loginUserName");
		}
		return "logout_success";
	}
	
	

	public void validate() {
		// TODO Auto-generated method stub
		//驗證使用者名稱不能為空
		if("".equals(user.getUsername().trim())){
			this.addFieldError("usernameError", "使用者名稱不能為空");
		}
		//驗證密碼不少於6位
		if(user.getPassword().length()<6){
			this.addFieldError("passwordError", "密碼不能少於6位");
		}
		
	}
	public Users getModel() {
		// TODO Auto-generated method stub
		return this.user;
	}
	
}

驗證使用者登入中,如果使用者名稱為空和密碼少於6位是不能登入的,同時會將出錯資訊新增到usernameError和passwordError,在Users_login.jsp中加入

<div>  <s:fielderror/> <!-- 顯示錶單驗證的出錯資訊 --></div>
我們演示一遍以上操作:


登入介面,輸入使用者名稱密碼即可登入;


歡迎介面,點選學生列表可以看到學生資訊,點選姓名可進入修改,點選刪除即可刪除該學生資訊,可新增學生資訊,學生人數過多時可根據學號查詢學生資訊;