1. 程式人生 > >JavaWeb之註冊實戰及資料管理操作

JavaWeb之註冊實戰及資料管理操作

一、總言

暑假做了招新網站,主要就是報名,資料通過表單進入資料庫,然後從前端提取資料庫資訊,並進行相關操作,下面我就具體說說相關實現。

二、實現

一、前端

一開始做的前端採用的是bootstrap框架,主要用柵格系統完成響應式的設計。設計一些js效果,比如滾動監聽改變導航欄透明度,背景的雨滴特效,點選特效。表單驗證用到了正則,和一個算數驗證外掛。開發工具為sublime。下面我簡單的介紹一些js效果。

首先是雨水背景,先建立一滴雨水的各個屬性,然後for迴圈不斷生成,每次在同一水平線不同位置隨機生成。期間也有參考他人程式碼。下面為雨水js程式碼。

		<script>
			var c=document.getElementById("c");
			var	ctx=c.getContext("2d");
				c.width=window.innerWidth;
				c.height=window.innerHeight;
				// c.height = 1160;
				// c.height=$(window).height();
//				ctx.fillRect(0,0,100,100);
//				a,b,c,d分別代表x方向偏移,y方向偏移,寬,高
			var string1 = "|";
				string1.split("");
			var fontsize=20;
				columns=c.width/fontsize;
			var drop = [];
			for(var x=0;x<columns;x++)
			{
				drop[x]=0;
			}
			function drap(){
				// ctx.fillStyle="rgba(0,0,0,0.07)";
				// ctx.fillStyle="rgba(255,251,240,0.07)";
				ctx.fillStyle="rgba(255,255,255,1)";
				ctx.fillRect(0,0,c.width,c.height);
				// ctx.fillStyle="#0F0";
				ctx.fillStyle="#A52A2A";
				ctx.font=fontsize+"px arial";
				for(var i=0;i<drop.length;i++){
					var text1=string1[Math.floor(Math.random()*string1.length)];
					ctx.fillText(text1,i*fontsize,drop[i]*fontsize);
					drop[i]++;
					if(drop[i]*fontsize>c.height&&Math.random()>0.9){//90%的機率掉落
						drop[i]=0;
					}
				}
			}
			setInterval(drap,25);
		</script>

然後是滾動監聽,這個比較簡單,通過函式獲取距離即可,然後獲取導航欄的id改變樣式。

   	<script>
	    function _scroll(){
            var scrollTop =$(window).scrollTop();
            // var widhe = $(window).height();
            if( scrollTop < 10 ){
            // if(scrollTop<widhe){
                $('.navbar').css('opacity',1);
                // $('.navbar').css('background','#F7F7F7');
            }else{
                // $('.navbar').css('background','#fff');
                $('.navbar').css('opacity',0.5);
            }
        }
        $(window).on('scroll',function() {
            _scroll()
        });
  	</script>

然後介紹一個簡單的表單正則驗證的js。

寫個焦點函式,獲取表單的輸入值,然後進行驗證,如果是對的則不會發生任何事情,否則會出現提示文字資訊。

			function checkNameFocus(){  
				function $(id){  
    				return document.getElementById(id);  
				}				
    			var userNameId=$("username");  
    			var namePrompt=$("un");
   				var reg = /^[\u4e00-\u9fa5]{2,11}$/;
				if (reg.test(userNameId.value) != true) {
		    		namePrompt.innerHTML="名字必須為2-11個漢字!"; 
		    		flag1 = 0;
				}
				else{
					flag1 = 1;
					namePrompt.innerHTML=""; 
					return;
				}
			}  

前端的一些js就介紹到這裡,然後前端的網頁實現是bootstrap框架的柵格系統,有興趣的可以自己去查一查,我就放一點程式碼作為參考。

<div class="col-sm-12">
<div class="col-sm-2">	</div>	
    <div class="col-xs-8 col-sm-4 bod col-sm-offset-0 col-xs-offset-2">
        <div class="web">
      	    <h3 style="text-align: center;font-weight: 600;">WEB組</h3>
      		<p class="lead">WEB組對每一屆新成員的基本學習規劃是:網站基本知識 -> HTML、CSS+DIV佈局 -> 資料庫 -> PHP程式設計基礎 -> Javascript -> PHP Web2.0網站開發,同時涉及到前端和後端兩個方向,經常有網站專案。</p>
      	</div>
    </div>
    <div class="col-xs-8 col-sm-4 bod col-sm-offset-0 col-xs-offset-2">
        <div class="pic">
            <img class="img-responsive" src="images/web-logo.jpg" alt="web">
        </div>
    </div>
</div>
<div class="col-sm-2">	</div>

前端就簡單介紹到這裡,下面介紹一下後臺的實現。

二、後臺

關於後臺的實現,我用的是eclipse,首先要明白javaweb的一些概念,下面是一些概念的介紹。

DAO —— Data Access Object資料訪問物件(介面)

DAOImpl 上面的實現類

entity —— 資料的物件

Service(不是Server)——就是中間層、邏輯層(介面)

ServiceImpl就是上面的實現類

util就是工具類的包

Servlet——JAVA WEB小應用。

連線資料庫一般將自己的資料庫資訊配置好properties,包括使用者名稱密碼,用到的資料庫的名字等資訊。資料庫我用的是mysql,建立資料庫比較簡單,配置好環境,學習了基本語法就可以了。

package sql;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

//連線資料庫
public class consql {

		private static String driver;
		private static String dburl;
		private static String user;
		private static String password;
		
		private static final consql factory = new consql();
		
		private Connection conn;
		
		static{
			Properties prop = new Properties();
			try {
				InputStream in = consql.class.getClassLoader()
						.getResourceAsStream("zxmysql.properties");
				prop.load(in);
				
			} catch (Exception e) {
				System.out.println("========配置檔案讀取錯誤=======");
			}
			
			driver = prop.getProperty("driver");
			dburl = prop.getProperty("dburl");
			user = prop.getProperty("user");
			password = prop.getProperty("password");
		}
		
		private consql () {
			
		}
		
		public static consql getInstance() {
			return factory;
		}
		
		public Connection makeConnection() {
			try {
				Class.forName(driver);
				conn = DriverManager.getConnection(dburl,user,password);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return conn;
		}

	

}

連線完資料庫可以自己寫java類測試一下是否連線成功。

然後通過get、set方法實現一個類,編寫entity層,這個比較簡單。

然後編寫dao介面和utils層。

先寫dao介面然後寫util,下面是dao介面程式碼。

package userdao;

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

import entersql.Getstudent;
import entersql.User;

public interface StudentDao {
	public void save(Connection conn,Getstudent user) throws SQLException ;
	
	public void update(Connection conn,Getstudent user) throws SQLException;

	public void delete(Connection conn,Getstudent user) throws SQLException;
	
	public ResultSet get(Connection conn, Getstudent user) throws SQLException;
	
	public List<Getstudent> getex(Connection conn) throws SQLException;
	
	public ResultSet getlogin(Connection conn , User user) throws SQLException;
	
//	ResultSet get(Getstudent user) throws SQLException;
}

util相對於比較簡單,根據自己所需要的功能編寫mysql語句,實現資料庫的增刪改查等功能即可,類似於下面這樣。

	public void delete(Connection conn, Getstudent user) throws SQLException {
		java.sql.PreparedStatement ps = conn.prepareStatement("DELETE FROM student_tbl WHERE student_xh = ?");
		ps.setString(1, user.getXH());
		ps.execute();

	}

然後是servlet的編寫,通過前端傳回的資料,讓資料進入資料庫等,這裡用到了很多,我就只拿刪除資料庫中的資料為例子。

package servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

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

import entersql.Getstudent;
import sql.consql;
import sqlOpr.sqlcz;
import userdao.StudentDao;


public class DeleServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");  
        request.setCharacterEncoding("UTF-8");  
        response.setCharacterEncoding("UTF-8"); 

		String student_xh = request.getParameter("student_xh");
	
		RequestDispatcher rd = null;
		String forward = null;

		Getstudent user = new Getstudent();
		user.setXH(student_xh);
		StudentDao userDao = new sqlcz();
		Connection conn = consql.getInstance().makeConnection();
		try {
			userDao.delete(conn, user);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			forward = "/WEB-INF/JieMian.jsp";
		
			rd = request.getRequestDispatcher(forward);
			rd.forward(request, response);
		
	}

	

}

在前端form表單中寫好action,呼叫servlet即可,寫了servlet之後web-xml一定要配置相應的資訊。以以上為例。

  <servlet>
    <servlet-name>BmServlet</servlet-name>
    <servlet-class>servlet.BmServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>BmServlet</servlet-name>
    <url-pattern>/bmServlet</url-pattern>
  </servlet-mapping>

然後就是一些其他功能,查重什麼的,實現也不是很難,我就不過介紹,主要還用到了ajax,用於學號查重,十分方便。

                var flag5 = false; //使用者名稱驗證
    
                $(function(){
                    var $xuehao = $("#xuehao"); //學號
                    $xuehao.blur(function(){                    //$xuehao.blur(function(){
                     var xuehao = $xuehao.val();
                        //console.log("hello")

                $.ajax({
                    //url : "./CheckXuehao",
                    url : "./CheckXuehao",
                    type : "post",
                    datatype : "json",
                    data : {
                        "xuehao" : xuehao
                    },
                    success : function(msg){
                        if (msg == 0) {
                            flag5 = false;
                            //var namePrompt=$("#xh");
                            //namePrompt.innerHTML="學號被佔用";
                            $("#xh23").html("該學號已報名!");
                        } else {
                            flag5 = true;
                            //var namePrompt=$("#xh");
                            //namePrompt.innerHTML="";
                            $("#xh23").html("");
                            }
                        }
                    });
                });
            });

三、管理頁面

這裡做的比較簡單,前端用的就是bootstrap的表單,然後連線資料庫,用next()函式掃描資料庫,只要有資料,用表單列印一行即可。刪除修改也是通過servlet實現,上面介紹的servlet實際上就是我刪除所用到的servlet。下載資料表格,是通過poi實現,先匯入所需要的jar包,然後編寫servlet,配置好相對應的web-xml資訊,這裡借鑑了其他人的程式碼。

package servlet;

import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

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

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import entersql.Getstudent;
import sql.consql;
import sqlOpr.sqlcz;
import userdao.StudentDao;

public class POI extends HttpServlet{
	/**
	 * 
	 */
	private static final long serialVersionUID = -8642375343202664090L;
	@SuppressWarnings("deprecation")
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ArrayList fieldname = getFieldName();
		String fname = "student " + getTimeStamp();
		OutputStream os = resp.getOutputStream();
		Connection conn = consql.getInstance().makeConnection();
		StudentDao studentDao = new sqlcz();
		List<Getstudent> list = null;
		try {
			list = studentDao.getex(conn);
		} catch (SQLException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		resp.reset();
		resp.setHeader("Content-disposition", "attachment;filename = " + fname + ".xls");
		resp.setContentType("application/msexcel");
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet();
		HSSFRow row = sheet.createRow((short) 0);
		for(int j = 0;j<fieldname.size();j++){
			HSSFCell cell = row.createCell((short)j);
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			sheet.setColumnWidth((short)j,(short)6000);
			HSSFCellStyle cellStyle = wb.createCellStyle();
			HSSFFont font = wb.createFont();
			font.setBold(true);
			short color = HSSFColor.RED.index;
			font.setColor(color);
			cellStyle.setFont(font);
			cell.setCellStyle(cellStyle);
			cell.setCellValue((String) fieldname.get(j));
		}
		int i = 0;
		Iterator<Getstudent> it = list.iterator();
		while(it.hasNext()){
			HSSFRow rowi = sheet.createRow((short)++i);
			Getstudent stu = it.next();
				HSSFCell cell0 = rowi.createCell((short)0);
				HSSFCell cell1 = rowi.createCell((short)1);
				HSSFCell cell2 = rowi.createCell((short)2);
				cell0.setCellValue((String) stu.getName());
				cell1.setCellValue((String) stu.getXH());
				cell2.setCellValue((String) stu.getPhone());

		}
		wb.write(os);
		os.flush();
		os.close();
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO 自動生成的方法存根
		super.doGet(req, resp);
	}
	public ArrayList getFieldName(){
		String str[]={"姓名","學號","電話"};
		ArrayList list=new ArrayList();
		for(int i=0;i<str.length;i++){
			list.add(str[i]);
		}
		return list;
	}
	public static String getTimeStamp() {
		SimpleDateFormat dateFormat = new SimpleDateFormat(
				"yyyy-MM-dd hh:MM:ss");
		Date date = new Date();
		return dateFormat.format(date);
	}
}

有些servlet引入到了我的其他包的類,所以程式碼不可直接套用。

我也處於學習階段,有些地方寫的不好或者解釋不清楚還請見諒。