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引入到了我的其他包的類,所以程式碼不可直接套用。
我也處於學習階段,有些地方寫的不好或者解釋不清楚還請見諒。