即將開始着手寫這個項目,所以希望通過這篇博客來記錄自己學習的過程
今天開學第一天,就上了軟件工程實踐課,自己也開始着手做這個大作業了。首先我的項目名稱叫做智能班車管理系統。
項目的概況:
該軟件產品是針對員工數量眾多的大型公司,解決其由於人員流動性大,公司缺乏完善的管理系統,無法對車輛、人員及線路等信息進行有效管理,導致管理混亂、效率低下、資源浪費等問題。在移動互聯網蓬勃發展的今天,各種包含數據分析、圖形可視化等技術的管理系統在企業經營過程中發揮着巨大的作用,單靠人工進行管理已經無法滿足企業的發展需求。從班車資源管理角度來說,很有必要對每輛車的乘坐率以及每條線路上的站台人數等進行統計,形成統計報表和統計模型,進而方便了解班車資源的使用情況,從而使管理者能夠對資源進行合理的分配和管理。因此,小組針對這些問題,在經過不斷地分析和總結后,提出以下項目建設目標,實現系統的全局優化。
上學期已經把這個項目的需求分析文檔和設計文檔完成了,如果需要的話可以到博客文件里面下載。
一,搭建環境
接下來是開發了,由於我的項目是JavaWeb,所以開發工具是用MyEclipse,MyEclipse開發Web比較方便,本身功能和Eclispe差不多,比Eclipse要多,Eclipse開發web需要下載插件。 其次需要用Tomcat服務器來發布網頁。再其次,數據庫用的是Oracle。
先下載一個MyEclipse,
安裝完MyEclispse,就可以下載Tomcat。根據自己的JDK版本,選擇不同的版本,32位和64位根據自己的MyEclipse選擇。我下載的是Tomcat6.0 JDK版本是1.6,這個要對應好,MyEclipse版本是MyEclispe 10 。
在安裝Tomcat的時候可能會遇到一些問題:
1.Tomcat 無法正常啟動 點擊start.bat出現一閃而過的問題。
2.Tomcat 可以啟動,但是瀏覽器無法進入localhost:8080/界面。
第一個原因,大多沒有配置JAVA_HOME或者JRE_HOME導致的環境變量配置的問題,這里百度上一大把教程,配置一下就好。
第二個可能是有些程序占用了8080端口,可以用netstat命令在cmd查看端口占用情況,換一個端口試試.
接下來在MyEclipse中配置Tomcat。window->preferences->搜索Tomcat->點擊Tomcat相應的版本
然后新建一個Web項目,把Web項目部署到Tomcat里面,再在MyEclipse啟動Tomcat,就可以了,這里我就不贅述了。
二,搭建SSH框架
搭建完環境之后,可以開始搭建SSH框架。Struts+Hibernate+Spring.這些天一直在研究這個框架,感覺至少有點體會了。首先說Struts 框架:
1,Struts
首先我們要明確一點SSH框架就是,SSH框架無非就是通過各種封裝,使得程序變得簡潔,易修改,代碼耦合度降低。關於代碼耦合度再說到Spring的時候再去研究一波。那么具體的,Struts在Web開發中是封裝什么的呢。
Web程序中,前端發送請求給后端,后端返回數據給前端。我們可以有兩種方式:
1)第一個就是普通的前端form表格(或者用AJAX)提交action 到相應url ,后台的url文件,通過Severlet的requset獲取前端提交的數據,response向前台輸出數據。
舉個例子:前端的提交表單:
<form action="login.jsp" method="post" align="center"> <input id="name" type="text"></input> <input id="pwd" type="password"></input> <input type="submit">登錄</input> </form>
這個時候后台建立一個相應的login.jsp 這里也可以是java文件,那么action="類名"
<script> var name=request.getParameter("name"); var pwd=request.getParameter("pwd"); if(Check(name,pwd)==true) response.getWriter().print("登錄成功"); else response.getWriter().print("登錄失敗"); </script>
response 也可以通過OutputStream向前台寫數據
response.setHeader("Content-type","text/html;charset=UTF-8");//向瀏覽器發送一個響應頭,設置瀏覽器的解碼方式為UTF-8 String data = "中國"; OutputStream stream = response.getOutputStream(); stream.write(data.getBytes("UTF-8"))
如果是傳向后台的java文件,那么java類要繼承HttpServelt。可以在后台建立new->Servelt文件,這里因為Jsp頁面有request,response和session等內置對象,所以在JSP頁面中可以直接使用
而在繼承Servelt的java類中,MyEclipse給你寫好了DoGet,和DoPost方法,分別接受前端的Post方法和Get方法。在里面寫相應的操作就好了。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); }
2), 這樣的普通方式,我們需要在前台和后台寫大量的代碼,那么另外一種方式就是通過Struts 框架,封裝操作。Struts 其實就是后端接受前端的數據,和返回數據,封裝起來。你無需寫requset或者responseStruts幫你弄好了。這里就要介紹Struts的結構。
a. Struts最核心的東西是攔截器。在web.xml里面配置Struts之后,那么web就會加載Struts的攔截器,代碼后面貼出。然后你前台的發送給后台的攔截器,都會被Struts攔截,根據Struts.xml的配置,將你的請求 轉到相應的后台action文件。這里可以看出,Struts框架要素有三個:1,web.xml配置Struts的核心控制器,用來攔截用戶的請求,並將請求轉發給相應的Action類來處理;2,Struts.xml是管理Action的映射,Struts的核心功能就是攔截器;3要有相應action類是后台操作類。還有一個,Struts有自己標簽庫,大大方便了前端向后端傳送數據。
b. 接下來我們就開始配置Struts。這里示范Struts2的配置。首先我們准備Struts2的包,Struts2的包我會提供,里面一共有9個包。將這個9個包拷貝到WEB-INF的lib目錄下即可。少一個,都會報錯的!
第二部,配置Web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <!-- 配置Struts2核心控制器的名字 --> <filter-name>struts2</filter-name> <!-- 配置Struts2核心控制器的實現類 --> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 配置Struts2攔截的URL --> <filter-mapping> <!-- 配置Struts2攔截器的名字 --> <filter-name>struts2</filter-name> <!-- 配置Struts2的核心FilterDispatcher攔截所有請求 --> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
這里要注意/*是所有請求,如果*.action是所有action請求,我之前犯了一個錯誤就是這里寫的是*.action,然后前台的請求沒有加上.action后綴,導致無法攔截請求!
web.xml配置之后。我們開始配置Struts.xml文件,新建一個xml(Basic) 然后里面的內容替換如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置包元素--> <package name="default" namespace="" extends="struts-default"> <!-- 配置action--> <action name="login" class="com.aciton.loginAction"> <result name="success">/success.jsp</result> </action> </package> </struts>
配置action,首先name="xxx" 的意思就是攔截前端名稱為login的請求,class="xxx" 的意思是將這個請求發送到后台com.action.loginAction類中。這個類可以事先建好。 接下來有一個method="xxx" ,這是值具體映射到類中的某個方 法,如果不寫就是默認的execute()方法。
<result name="success">xxx.jsp</result> 意識后端action類返回success的時候,跳轉到xxx.jsp。<result> 是Struts中的輸出和跳轉組件。后面會詳解。
現在我們要明白這樣一個流程,當Tomcat發布網站的時候,會通過Web.xml加載Struts的控制器和攔截器,然后如果前端頁面有任何的請求都會被Struts攔截,接着通過Struts.xml的配置映射到相應的action控制類,
還要注意一點struts.xml不能是Struts.xml否則會報錯。
這樣Struts框架就已經搭建好了。很簡單,對不對。
接下來就是前段的界面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> <form action="login" method="post"> 用戶:<input name="name" type="text"></input> 密碼:<input name="pwd" type="password"></input> <input type="submit" value="登錄"></input> </form> <s:form action="login"> <s:textfield label="用戶" name="name" ></s:textfield> <s:password label="密碼" name="pwd" ></s:password> <s:submit type="submit" value="登錄" ></s:submit> </s:form> </body> </html>
這里我用了兩種方式,一個struts標簽庫,另一個就是普通的標簽,二者效果一樣的。
后台的action類:
package com.action; import com.opensymphony.xwork2.ActionSupport; public class loginAction extends ActionSupport{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } private String pwd; public String execute(){ System.out.println("ok"); if(name.equals("123")&&pwd.equals("123")) return SUCCESS; else return INPUT; } }
這里要強調,action類里面的name和pwd必須和前台的name="name" name="pwd",一樣,這樣才能傳到后台。這里我們看到,后台不需要寫request來獲取前端傳過來的值,因為我們有了set訪問器,通過Struts自動傳了值,簡化了代碼
一個最簡單的Struts框架就搭建了。
http://download.csdn.net/detail/dacc123/9801938 這是下載地址,可以下載StrutsTest壓縮包,是Struts的簡單實例。
c. 搭建完Struts后,我想用Struts的標簽庫來做前端。可是小組分工之后,前端頁面是別的組員做的。登錄界面拿過來之后傻眼了,沒有form表格,更沒有<s:form> 這要怎么辦?我在想如果把標簽都換成Struts的呢,后來改了一下,發現效果 都沒有了。雖然Struts標簽有個cssStyle.但是改了之后,雖然有變化,但還是磨合不到一起去。這樣的話,只能用別的方式了,沒有form表格,只有ajax了。AJAX是一種異步傳輸技術。AJAX 是與服務器交換數據並更新部分網頁的藝術,在 不重新加載整個頁面的情況下。這里也就圖一個方便,可以不用form表格來提交數據。之后會詳解AJAX。Ajax也是想后端發送post和get請求,所以struts的作用仍然有,只是沒有標簽的情況下,作用少了一點。接下來就嘗試着用ajax通過 Struts向后台傳送Json數據,並返回Json數據。
AJAX 其實很簡單,它有這些屬性:(我們這里說的Jquery中的AJAX方法,AJAX的基礎是XMLHttpRequest 。我們用Jquery的AJAX方法更簡潔)
url:請求發送的地址
data:想請求地址發送的數據
type:發送請求的類型
success:function(data):請求發送成功的回調函數
datatype:希望服務器返回數據的類型
async:是異步請求還是同步請求(其實這個異步和同步請求,很簡單,異步請求就是發送了請求之后不跳轉界面,而同步請求發送了請求了之后需要跳轉界面)
fail:function(data):請求失敗的回調函數
還有一些別的參數,我沒有用到。
Jquery的AJAX函數有兩種寫法,一種是
$.ajax({ "type":"post", "url":"login", "traditional":true, "data":{"name":"123","password":"123"}, "type":"json", "contentType": "application/x-www-form-urlencoded; charset=utf-8", "success":function(data){ }; "fail":function(data) }
})
還有一種就是上面的簡寫:
$.post("login.action",{"name":name,"password":pwd,"identity":identy},function(data){},"json")
上面的是post的方法,get方法也一樣
首先在前台界面:
ajax 向后台傳數據<br> 用戶:<input id="name" name="name" type="text"></input> 密碼:<input id="pwd" name="pwd" type="password"></input> <input type="submit" value="登錄" onclick="fun()"></input>
和ajax方法:
<script> function fun(){ alert("ok"); $.post("login2",{name:$("#name").val(),pwd:$("#pwd").val()},function(data){ alert(data); var d = eval("(" + data + ")"); if(d.login=="success"){ window.location.href = "success.jsp"; } else window.location.href = "index.jsp"; },"json"); } </script>
同是我們需要導入
struts2-json-plugin-2.3.8.jar 這個包是支持在Struts下傳送Json數據的
在Sturts.xml配置文件中
<package name="default" namespace="" extends="struts-default,json-default"> <action name="login" class="com.action.loginAction"> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result> </action> <action name="login2" class="com.action.loginAction"> <result name="success" type="json"> <param name="root">result</param> </result> </action> </package>
extends加上一個json-default 在添加一個action
<result name="success" type="json"> 是返回前台json數據的result類型
<param name="root">result</param> 將后台的result的字符串變成Json格式的數據再傳遞到后台<param></param>標簽就是一個參數賦值的標簽,把result賦值給了root。
在后台我們添加result
package com.action; import com.opensymphony.xwork2.ActionSupport; public class loginAction extends ActionSupport{ private String name; private String pwd; private String result; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String execute(){ System.out.println("ok"); System.out.println(name+" "+pwd); if(name.equals("123")&&pwd.equals("123")){ result = "{\"login\":\"success\"}"; return SUCCESS; } else{ result = "{\"login\":\"fail\"}"; return INPUT; } } }
注意result必須要有get,set訪問器。
然后就可以實現ajax 向Struts后台傳送json數據,我寫了一個實例,大家可以下載
http://download.csdn.net/detail/dacc123/9824358