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的實現類UsersDAOImplpublic 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>
我們演示一遍以上操作:
登入介面,輸入使用者名稱密碼即可登入;
歡迎介面,點選學生列表可以看到學生資訊,點選姓名可進入修改,點選刪除即可刪除該學生資訊,可新增學生資訊,學生人數過多時可根據學號查詢學生資訊;