即將開始着手寫這個項目,因此但願經過這篇博客來記錄本身學習的過程css
今天開學第一天,就上了軟件工程實踐課,本身也開始着手作這個大做業了。首先個人項目名稱叫作智能班車管理系統。html
項目的概況:前端
該軟件產品是針對員工數量衆多的大型公司,解決其因爲人員流動性大,公司缺少完善的管理系統,沒法對車輛、人員及線路等信息進行有效管理,致使管理混亂、效率低下、資源浪費等問題。在移動互聯網蓬勃發展的今天,各類包含數據分析、圖形可視化等技術的管理系統在企業經營過程當中發揮着巨大的做用,單靠人工進行管理已經沒法知足企業的發展需求。從班車資源管理角度來講,頗有必要對每輛車的乘坐率以及每條線路上的站臺人數等進行統計,造成統計報表和統計模型,進而方便了解班車資源的使用狀況,從而使管理者可以對資源進行合理的分配和管理。所以,小組針對這些問題,在通過不斷地分析和總結後,提出如下項目建設目標,實現系統的全局優化。java
上學期已經把這個項目的需求分析文檔和設計文檔完成了,若是須要的話能夠到博客文件裏面下載。web
一,搭建環境ajax
接下來是開發了,因爲個人項目是JavaWeb,因此開發工具是用MyEclipse,MyEclipse開發Web比較方便,自己功能和Eclispe差很少,比Eclipse要多,Eclipse開發web須要下載插件。 其次須要用Tomcat服務器來發佈網頁。再其次,數據庫用的是Oracle。數據庫
先下載一個MyEclipse,apache
安裝完MyEclispse,就能夠下載Tomcat。根據本身的JDK版本,選擇不一樣的版本,32位和64位根據本身的MyEclipse選擇。我下載的是Tomcat6.0 JDK版本是1.6,這個要對應好,MyEclipse版本是MyEclispe 10 。json
在安裝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