夏季學期軟工綜合實踐小記(一)
本周是軟工方面夏季學期的第一周,前三天我們在東軟講師劉老師的帶領下完成了接下來的日子中需要的編程軟件MyEclipse和數據庫應用軟件Navicat for MySQL以及相關環境的配置安裝,並在後來的學習中逐步回顧了曾在數據庫原理課程中學習過的SQL語句及其使用。
課堂上劉老師帶領我們對JDBC、Java Servlet等常用編程框架作了了解,並講授了不少軟件的使用和編碼的快速補全技巧,如:
在編程中可以通過快捷鍵 alt+shift+s 快速生成常用的 get()、set()或是構造方法
在實際開發過程中不少代碼都可以通過快捷鍵 alt+/ 進行快速補全,如最常用的輸出語句 System.out.println()就可以通過 syso 關鍵字加快捷鍵的操作快速補全。其他時候這一快捷鍵也能得到經常性的應用,並且通過快捷鍵進行補全的代碼會自動導入所需要的包,不需要再手動一個個字符輸入,能夠大大提升編程效率。
另外我們還創建了一個自己的在後續課程內容中經常使用的數據庫mybatis,並通過代碼實現對其進行連接、訪問、查詢、關閉連接等操作,下面附上代碼
//驅動加載
static{
try { Class.forName(DRIVER); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
//獲取連接
public static void getConnection(){
try { con
catch (SQLException e) { e.printStackTrace(); }
}
//關閉連接
public static void closeAll(){
if(null!=rs){
try { rs.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
if(null!=ps){
try { ps.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
if(null!=con){
try { con.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
}
//查詢操作
public static ResultSet executeQuery(String sql,Object[] obj){
getConnection();
//System.out.println(obj);
//如果語句不夠完整,是需要進行拼接的
try { ps = con.prepareStatement(sql);
if(null!=obj){
for(int i=0;i<obj.length;i++){ ps.setObject(i+1, obj[i]); }
}
rs = ps.executeQuery();
}
catch (SQLException e) { e.printStackTrace(); }
return rs;
}
//統一的執行增 刪 改操作的方法 insert delete update
public static int executeUpdate(String sql,Object[] obj){
int count = 0;
getConnection();//調用上面的連接方法獲得與數據庫的連接
try { ps = con.prepareStatement(sql);
if(null!=obj){
for(int i=0;i<obj.length;i++){ ps.setObject(i+1, obj[i]); }
}
count = ps.executeUpdate();
}
catch (SQLException e) { e.printStackTrace(); }
finally{ closeAll(); }
return count;
}
通過以上方法我們實現了程序對數據庫內容的訪問和更新,並且通過接口UserinfoDao及其具體實現類以各類調用上述方法的方法實現了可以具體使用的功能,下面附上方法名
//插入用戶信息,Userinfo 實體類攜帶用戶信息
public boolean addUser(Userinfo userinfo);
//根據 用戶姓名 修改 用戶密碼
public boolean updateUser(Userinfo userinfo);
//根據 用戶姓名 刪除 用戶信息
public boolean deleteUser(String username);
//查詢所有用戶信息
public List<Userinfo> findAll();
//根據用戶名查詢,基於實際情況,1個用戶名只對應1個用戶,因此只能查到1條記錄
//所以,可以不使用list 而直接使用 Userinfo 作為方法返回類型
public Userinfo findByUsername(String username);
在前面的基礎上,我們進一步創建了servlet框架的web工程,通過軟件將代碼發布到Tomcat服務器上並通過網頁訪問和使用代碼,實現了網頁頁面和數據庫內容通過代碼層進行聯通顯示使用的目的。我們創建的數據庫保存的是一些人員的信息,包括用戶ID userid,用戶名username和密碼pwd,通過web工程及代碼我們實現了通過網頁訪問相關端口和下轄地址進行用戶登錄、顯示用戶信息等功能,下面附上代碼
public class LoginAction extends HttpServlet {
//如果具體頁面文件裏的方法寫的是 get 那麽盡可能在doGet裏寫具體方法 反之寫的post 就在doPost裏面寫方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
//獲取頁面中輸入的信息 request.getParameter("username") username 是對應的網頁中 input框的 name
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
System.out.println("獲取的用戶名"+username);
System.out.println("獲取的密碼"+pwd);
//亂碼轉換 可以將 ISO-8859-1 標準轉為 utf-8 還可轉換為別的形式
username = new String (username.getBytes("ISO-8859-1"),"utf-8");
System.out.println("轉碼之後的用戶名:"+username);
UserinfoBiz biz = new UserinfoBizImpl();
String msg = biz.UserLogin(username, pwd);
//根據返回的結果,進行頁面跳轉
if(msg.equals("ok")){
request.setAttribute("uname", username);
request.getRequestDispatcher("WEB-INF/jsp/success.jsp").forward(request, response); //WEB-INF目錄下的文件不可通過網頁直接輸入地址訪問,只能通過別的方法以“轉發”的形式進行訪問,若進入工程目錄底下的這一jsp文件則說明觸發了該“轉發”,即訪問成功了
}else if(msg.equals("unameErr")){
request.setAttribute("unameErr", "用戶名錯誤!");
request.getRequestDispatcher("login.jsp")
.forward(request, response);
}else if(msg.equals("pwdErr")){
request.setAttribute("pwdErr", "密碼錯誤!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
在具體的頁面編寫文件中,我們進行了如下內容的編輯:
//index.jsp
<body>
<a href="login.jsp">登陸</a><br/>
<!-- 上下是兩種不同的表述方式,但意義均為點擊兩個<a>之間的漢字表示的連接後跳轉入前面的地址 -->
<a href="http://localhost:8080/jspservlet_1/ListAllAciton">用戶列表</a>
</body>
//login.jsp 此為實現檢測用戶輸入內容進行登錄的頁面
<body>
<form action="LoginAction" method="get">
用戶名:<input type="text" name="username" id="username"
placeholder="請輸入賬戶" required="required"/>
<font color="red">${unameErr }</font>
<br/><!-- <br/>為換行符,實現頁面中顯示內容的換行 -->
<!-- required="required"表示此項必須填寫,${ }為EL表達式 -->
密 碼:<input type="password" name="pwd" id="pwd"
placeholder="請輸入密碼" required="required"/>
<font color="red">${pwdErr }</font>
<br/>
<input type="submit" value="登錄"/>
</form>
</body>
//Users.jsp
<body>
<center><!-- 居中 -->
<h1>用戶列表</h1>
<table border="1">
<tr>
<td>用戶編號</td>
<td>用戶名</td>
<td>用戶密碼</td>
</tr>
<!-- 第二行開始作信息顯示,信息較多使用循環 -->
<!-- 這裏使用了c標簽,c:foreach標簽items是用來接收數據的,var用於定義別名 -->
<c:forEach items="${users}" var="d">
<tr>
<!-- ${d.userid }中 . 後面的userid是Userinfo實體類中屬性的名字,必須嚴格對應,對大小寫敏感 -->
<td><a href="#">${d.userid}</a></td>
<td>${d.username}</td>
<td>${d.pwd}</td>
</tr>
</c:forEach>
</table>
</center>
</body>
通過幾天的學習,我們在以往簡單的編寫方法和代碼的基礎上對軟件的具體開發有了新的認識。以往都只是設計編寫本地的一些小的程序,現在真正涉及到了能夠具體用於項目級別開發的方法,像網頁連接、數據庫內容的使用等都是以前從未接觸過的。
總的來講近期所講內容和以前的算法邏輯和程序編寫相近,還是比較能夠接受的,只是不同類和包之間的多次跳轉對第一次接觸較大型工程的我們來講有些難以適應,希望後續的學習中能夠獲得更多有用的技能
夏季學期軟工綜合實踐小記(一)