javaWeb項目(SSH框架+AJAX+百度地圖API+Oracle數據庫+MyEclipse+Tomcat)之一 基礎Struts框架搭建篇


即將開始着手寫這個項目,所以希望通過這篇博客來記錄自己學習的過程

 

今天開學第一天,就上了軟件工程實踐課,自己也開始着手做這個大作業了。首先我的項目名稱叫做智能班車管理系統。

 

項目的概況:

該軟件產品是針對員工數量眾多的大型公司,解決其由於人員流動性大,公司缺乏完善的管理系統,無法對車輛、人員及線路等信息進行有效管理,導致管理混亂、效率低下、資源浪費等問題。在移動互聯網蓬勃發展的今天,各種包含數據分析、圖形可視化等技術的管理系統在企業經營過程中發揮着巨大的作用,單靠人工進行管理已經無法滿足企業的發展需求。從班車資源管理角度來說,很有必要對每輛車的乘坐率以及每條線路上的站台人數等進行統計,形成統計報表和統計模型,進而方便了解班車資源的使用情況,從而使管理者能夠對資源進行合理的分配和管理。因此,小組針對這些問題,在經過不斷地分析和總結后,提出以下項目建設目標,實現系統的全局優化。

上學期已經把這個項目的需求分析文檔和設計文檔完成了,如果需要的話可以到博客文件里面下載。

一,搭建環境

接下來是開發了,由於我的項目是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

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM