電商項目(三)

(1)搭建前臺系統(tǒng)。

(2)完成首頁導航菜單。(學習jsonp

(3)完成CMS內容管理系統(tǒng)鲸阔。

(4)完成首頁大廣告位投放。(學習Httpclient


[if !supportLists]1????????????[endif]搭建前臺系統(tǒng)

[if !supportLists]1.1?????????[endif]前臺系統(tǒng)架構

[if !vml]

[endif]

在互聯(lián)網系統(tǒng)開發(fā)當中迄委,我們一般都是采用了分層的方式來架構系統(tǒng)褐筛,即:

(1)門戶層(門戶系統(tǒng)):網站的入口

i、渲染視圖叙身,提供用戶訪問的頁面渔扎。

ii、不查詢數(shù)據(jù)庫信轿,數(shù)據(jù)來自對遠程服務(接口)的調用晃痴。

(2)服務層:基于restful,以接口的形式對外提供公共的服務虏两。

i愧旦、連接數(shù)據(jù)庫,返回json格式的數(shù)據(jù)定罢。


[if !supportLists]1.1.1????????[endif]分層架構的好處

(1)、有利于系統(tǒng)的維護和拓展旁瘫。

(2)祖凫、有利于SOA服務治理的基礎。

[if !supportLists]1.2?????????[endif]搭建服務層系統(tǒng)

[if !supportLists]1.2.1????????[endif]系統(tǒng)簡介

基于RESTful實現(xiàn)酬凳。以接口的形式惠况,對外提供公共的服務。(比如購物車宁仔、導航菜單稠屠、搜索、訂單等等)

RESTful是一種接口設計理念翎苫,即:

(1)不同的請求方式权埠,對應不同的業(yè)務類型:

??????GET?? :查詢

??????POST? :添加

??????PUT?? :更新

??????DELETE:刪除

(2)返回json格式數(shù)據(jù)。


[if !supportLists]1.2.2????????[endif]技術選擇

核心框架:Spring+SpringMVC+Mybatis-plus

數(shù)據(jù)庫:MySQL

前端框架:無


[if !supportLists]1.2.3????????[endif]配置步驟

思路:(1)創(chuàng)建項目煎谍,導入jar依賴攘蔽。

????????(2)整合SSM框架。


[if !supportLists]1.2.3.1????[endif]第一步:創(chuàng)建maven項目(war)模型

注意:(1)項目繼承ego-project呐粘。

????? (2)使用maven module創(chuàng)建項目

[if !vml]

[endif]


[if !supportLists]1.2.3.2????[endif]第二步:導入jar依賴

導包說明:

??? (1)ego-base子工程

???????(2)Spring核心包

???????(3)SpringMVC相關包

???????(4)AOP相關包

???????(5)JDBC满俗、事物相關包

(6)Mybatis-plus及整合包

(7)JSON依賴包

導入插件:Tomcat插件(開發(fā)階段转捕,啟動項目,對外發(fā)布接口)


<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

? <modelVersion>4.0.0</modelVersion>

? <parent>

??? <groupId>cn.gzsxt.ego</groupId>

??? <artifactId>ego-project</artifactId>

??? <version>1.0</version>

? </parent>

? <groupId>cn.gzsxt.ego</groupId>

? <artifactId>ego-rest</artifactId>

? <version>1.0</version>

? <packaging>war</packaging>


? <dependencies>

??? <dependency>

?????? <groupId>cn.gzsxt.ego</groupId>

??? ??? <artifactId>ego-base</artifactId>

??? ??? <version>1.0</version>

??? </dependency>

??? <!-- 整合SSM唆垃,導入spring五芝、springmvc、mybatis相關依賴 -->

??? <!-- 導入spring核心依賴?? 4+1 -->

??? <dependency>

?????? <groupId>org.springframework</groupId>

?????? <artifactId>spring-context</artifactId>

??? </dependency>

??? <!-- 導入spirng-jdbc+事物 -->

??? <dependency>

?????? <groupId>org.springframework</groupId>

?????? <artifactId>spring-jdbc</artifactId>

??? </dependency>?

??? <!-- 導入事物的依賴 :切面 -->

??? <dependency>

?????? <groupId>org.springframework</groupId>

?????? <artifactId>spring-aspects</artifactId>

??? </dependency>


??? <!-- 導入springmvc相關依賴 -->

??? <dependency>

?????? <groupId>org.springframework</groupId>

?????? <artifactId>spring-webmvc</artifactId>

??? </dependency>


??? <!-- 導入mybatis相關依賴 -->

??? <dependency>

?????? <groupId>org.mybatis</groupId>

?????? <artifactId>mybatis-spring</artifactId>

??? </dependency>


??? <!-- 導入jdbc辕万、連接池依賴 -->

??? <!-- MySql -->

??? <dependency>

?????? <groupId>mysql</groupId>

?????? <artifactId>mysql-connector-java</artifactId>

??? </dependency>

??? <!-- 連接池 -->

??? <dependency>

?????? <groupId>com.alibaba</groupId>

?????? <artifactId>druid</artifactId>

??? </dependency>


??? <dependency>

?????? <groupId>com.fasterxml.jackson.core</groupId>

?????? <artifactId>jackson-databind</artifactId>

??? </dependency>

? </dependencies>

? <build>

? ???? <plugins>

?????? ???? <!-- 配置Tomcat插件 -->

?????? ???? <plugin>

?????????? ????? <groupId>org.apache.tomcat.maven</groupId>

?????????? ????? <artifactId>tomcat7-maven-plugin</artifactId>

?????????? ????? <configuration>

????????????? ?????? 8081

????????????? ?????? <path>/</path>

????????????? ?????? <uriEncoding>UTF-8</uriEncoding>

?????????? ????? </configuration>

?????? ???? </plugin>

??? ???? </plugins>

? ? </build>

</project>


[if !supportLists]1.2.3.3????[endif]第三步:創(chuàng)建web.xml文件

說明:可以從ego-manager工程中拷貝枢步,修改<url-pattern>即可。

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xml="http://www.w3.org/XML/1998/namespace"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

? http://xmlns.jcp.org/xml/ns/javaee/web-app_2_5.xsd ">


??? <!-- 配置編碼過濾器蓄坏,防止post請求亂碼 -->

??? ? <filter>

??? ? ???? <filter-name>characterEncodingFilter</filter-name>

??? ? ???? <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

??? ? ???? <init-param>

??? ? ???????? <param-name>encoding</param-name>

??? ? ???????? <param-value>utf-8</param-value>

??? ? ???? </init-param>

??? ? </filter>

? <filter-mapping>

? ???? <filter-name>characterEncodingFilter</filter-name>

? ???? <url-pattern>/*</url-pattern>

? </filter-mapping>

??? <servlet>

?????? <servlet-name>dispatcherServlet</servlet-name>

?????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

?????? <init-param>

?????????? <param-name>contextConfigLocation</param-name>

?????????? <param-value>classpath:spring-*.xml</param-value>

?????? </init-param>

?????? <!-- 項目啟動的時候价捧,就加載spring容器 -->

?????? <load-on-startup>1</load-on-startup>

??? </servlet>

??? <servlet-mapping>

?????? <servlet-name>dispatcherServlet</servlet-name>


?????? <!-- 所有請求rest服務層系統(tǒng)的請求,都必須在url加上/rest前綴涡戳,好處:方便做維護结蟋。 -->

??? ??? /rest/*

??? </servlet-mapping>

</web-app>


[if !supportLists]1.2.3.4????[endif]第四步:整合SSM框架

整合中所需要的配置文件,均可從ego-manager工程中拷貝渔彰,修改局部的配置即可嵌屎。

[if !supportLists]1.2.3.4.1????[endif]Step1:Spring整合SpringMVC

創(chuàng)建spring-mvc.xml文件,做如下配置:

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

??? xmlns:context="http://www.springframework.org/schema/context"

??? xmlns:mvc="http://www.springframework.org/schema/mvc"

??? xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd

?????? http://www.springframework.org/schema/beans? http://www.springframework.org/schema/beans/spring-beans.xsd

?????? http://www.springframework.org/schema/context? http://www.springframework.org/schema/context/spring-context-4.1.xsd">


??? <!-- 開啟注解掃描 -->

??? <context:component-scanbase-package="cn.gzsxt.rest"/>

??? <!-- 開啟注解驅動 -->

??? <mvc:annotation-driven/>

</beans>


[if !supportLists]1.2.3.4.2????[endif]Step2:mybatis-plus整合spring

在這里恍涂,我們一定要有一個概念:任何持久層框架和Spring的整合宝惰,都是為了使用Spring的事物代理。


(1)創(chuàng)建resource.properties文件再沧,配置數(shù)據(jù)庫連接信息如下:

#配置數(shù)據(jù)源

db.driver=com.mysql.jdbc.Driver

db.url=jdbc:mysql://localhost:3306/ego

db.username=root

db.password=gzsxt


(2)創(chuàng)建spring-data.xml文件尼夺,配置框架整合。

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

??? xmlns:context="http://www.springframework.org/schema/context"

??? xmlns:tx="http://www.springframework.org/schema/tx"

??? xsi:schemaLocation="http://www.springframework.org/schema/beans

? http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

?????? http://www.springframework.org/schema/context? http://www.springframework.org/schema/context/spring-context-4.3.xsd

?????? http://www.springframework.org/schema/tx? http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">


??? <context:property-placeholderfile-encoding="utf-8"location="classpath:resource.properties"/>


??? <!-- 1炒瘸、創(chuàng)建數(shù)據(jù)源 -->

??? <beanname="dataSource"class="com.alibaba.druid.pool.DruidDataSource">

?????? <propertyname="driverClassName"value="${db.driver}"/>

?????? <propertyname="url"value="${db.url}"/>

?????? <propertyname="username"value="${db.username}"/>

?????? <propertyname="password"value="${db.password}"/>

?????? <propertyname="maxActive"value="20"/>

?????? <propertyname="minIdle"value="5"/>

??? </bean>


??? <!-- 2淤堵、mybatis-plus整合Spring

?????? 任何的數(shù)據(jù)庫的框架,要使用spring的事物代理顷扩,必須使用spring提供的數(shù)據(jù)源拐邪,必須整合spring才可以使用

??? -->

??? <beanname="sqlSessionFactoryBean"class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">

?????? <!-- 加載數(shù)據(jù)源 -->

?????? <propertyname="dataSource"ref="dataSource"/>


?????? <!-- 指定pojo目錄-->

?????? <propertyname="typeAliasesPackage"value="cn.gzsxt.base.pojo"/>


?????? <!-- 配置mybatis-plus插件 -->

?????? <propertyname="plugins">

?????????? <list>

?????????? ??? <!-- 配置分頁插件 -->

????????????? <beanclass="com.baomidou.mybatisplus.plugins.PaginationInterceptor"/>


????????????? <!-- 配置攔截器屬性 -->

????????????? <beanclass="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">

????????????????? <!-- 配置sql響應時間,開發(fā)階段方便做調優(yōu) -->

????????????????? <propertyname="maxTime"value="1000"/>

????????????????? <propertyname="format"value="true"/>


????????????? </bean>

?????????? </list>

?????? </property>


?????? <!-- 配置mybatis-plus全局策略 -->

?????? <propertyname="globalConfig"ref="globalConfiguration"></property>


??? </bean>


??? <!-- 3隘截、配置mybatis的動態(tài)代理 -->

??? <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">


?????? <propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactoryBean"/>


?????? <propertyname="basePackage"value="cn.gzsxt.base.mapper"></property>


??? </bean>



??? <!-- 配置mybatis-plus全局屬性 -->

??? <!-- 定義 MybatisPlus 的全局策略配置-->

??? <beanid="globalConfiguration"class="com.baomidou.mybatisplus.entity.GlobalConfiguration">


? <!-- 在 2.3 版本以后扎阶,dbColumnUnderline 默認值是 true,即pojo屬性開啟駝峰標識 -->


? <propertyname="dbColumnUnderline"value="true"></property>


? <!-- 全局的主鍵策略 -->


? <!--

??????????? AUTO->`0`("數(shù)據(jù)庫ID自增")

???????????? INPUT->`1`(用戶輸入ID")

??????????? ID_WORKER->`2`("全局唯一ID")

??????????? UUID->`3`("全局唯一ID")


? -->


? <propertyname="idType"value="0"></property>


? <!-- 全局的表前綴策略配置 -->


? <propertyname="tablePrefix"value="tb_"></property>

??? </bean>


??? <!-- 4婶芭、配置事物管理器 -->

??? ?<beanname="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

??? ?????? <propertyname="dataSource"ref="dataSource"></property>

??? ?</bean>


??? <!-- 5东臀、開啟注解聲明式事物 -->

??? <tx:annotation-driven/>

</beans>



[if !supportLists]1.2.3.5????[endif]第五步:整合測試

在這里我們使用靜態(tài)數(shù)據(jù)(category.json),來模擬導航菜單接口的實現(xiàn)雕擂。


(1)拷貝category.json文件到webapp目錄下啡邑。

[if !vml]

[endif]


(2)更新項目、安裝到本地倉庫(updata井赌、maven clean谤逼、maven install)

(3)啟動項目

[if !vml]

[endif]


查看控制臺贵扰,啟動成功!!!

[if !vml]

[endif]


(4)瀏覽器訪問,地址:http://localhost:8081/category.json流部,整合成功F萑啤!枝冀!

[if !vml]

[endif]


[if !supportLists]1.3?????????[endif]搭建門戶系統(tǒng)

[if !supportLists]1.3.1????????[endif]系統(tǒng)簡介

簡單來說就是網站的入口舞丛,提供用戶瀏覽、下單的操作頁面果漾。

門戶系統(tǒng)不直接調用數(shù)據(jù)庫球切,而是通過服務系統(tǒng)提供的接口獲取數(shù)據(jù)。電商绒障、互聯(lián)網行業(yè)開發(fā)都是面向服務開發(fā)吨凑。

[if !supportLists]1.3.2????????[endif]技術選擇

核心框架:Spring+SpringMVC

數(shù)據(jù)庫:無

前端技術:jquery、ajax户辱、css+div鸵钝、easyui等


[if !supportLists]1.3.3????????[endif]配置步驟

思路:(1)創(chuàng)建項目

????????(2)框架整合


[if !supportLists]1.3.3.1????[endif]第一步:創(chuàng)建maven項目(war模型)

注意:(1)繼承ego-project工程

????? (2)使用maven module創(chuàng)建子系統(tǒng)

[if !vml]

[endif]


[if !supportLists]1.3.3.2????[endif]第二步:導入jar依賴

在門戶系統(tǒng)中,不直接查詢數(shù)據(jù)庫庐镐,所以不需要導入數(shù)據(jù)庫相關的jar包恩商。

在門戶系統(tǒng)中,用戶能夠搜索必逆、瀏覽商品怠堪,提交訂單等,所以需要添加jsp視圖相關依賴名眉。

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

? http://maven.apache.org/xsd/maven-4.0.0.xsd">

? <modelVersion>4.0.0</modelVersion>

? <parent>

??? <groupId>cn.gzsxt.ego</groupId>

??? <artifactId>ego-parent</artifactId>

??? <version>1.0</version>

? </parent>

? <groupId>cn.gzsxt.ego</groupId>

? <artifactId>ego-portal</artifactId>

? <version>1.0</version>

? <packaging>war</packaging>


? <dependencies>

? ???? <dependency>

? ??????????? <groupId>cn.gzsxt.ego</groupId>

? ??????????? <artifactId>ego-base</artifactId>

? ??????????? <version>1.0</version>

? ???? </dependency>



? ???? <dependency>

?????????? <groupId>jstl</groupId>

?????????? <artifactId>jstl</artifactId>

?????? </dependency>

?????? <dependency>

?????????? <groupId>javax.servlet</groupId>

?????????? <artifactId>servlet-api</artifactId>

?????????? <scope>provided</scope>

?????? </dependency>

?????? <dependency>

?????????? <groupId>javax.servlet</groupId>

?????????? <artifactId>jsp-api</artifactId>

?????????? <scope>provided</scope>

?????? </dependency>

?????????? <!-- 導入spring核心依賴?? 4+1 -->

?????????? <dependency>

?????????? <groupId>org.springframework</groupId>

?????????? <artifactId>spring-context</artifactId>

?????? </dependency>

?????? <!-- 導入springmvc相關依賴 -->

?????? <dependency>

?????????? <groupId>org.springframework</groupId>

?????????? <artifactId>spring-webmvc</artifactId>

?????? </dependency>



?????? <dependency>

?????????? <groupId>com.fasterxml.jackson.core</groupId>

?????????? <artifactId>jackson-databind</artifactId>

?????? </dependency>

? </dependencies>

? <build>

? ???? <plugins>

?????? <!-- 配置Tomcat插件 -->

?????? <plugin>

?????????? <groupId>org.apache.tomcat.maven</groupId>

?????????? <artifactId>tomcat7-maven-plugin</artifactId>

?????????? <configuration>

????????????? 8082

????????????? <path>/</path>

????????????? <uriEncoding>UTF-8</uriEncoding>

?????????? </configuration>

?????? </plugin>

??? </plugins>

? ? </build>

</project>


[if !supportLists]1.3.3.3????[endif]第三步:創(chuàng)建web.xml文件

可以從ego-rest工程拷貝研叫,修改<url-parten>配置

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xml="http://www.w3.org/XML/1998/namespace"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_2_5.xsd

? ">

??? <welcome-file-list>

?????? <welcome-file>index.html</welcome-file>

??? </welcome-file-list>


??? <!-- 配置編碼過濾器,防止post請求亂碼 -->

??? ? <filter>

??? ? ???? <filter-name>characterEncodingFilter</filter-name>

??? ? ???? <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>


??? ? ???? <init-param>

??? ? ???????? <param-name>encoding</param-name>

??? ? ???????? <param-value>utf-8</param-value>

??? ? ???? </init-param>


??? ? </filter>


? <filter-mapping>

? ???? <filter-name>characterEncodingFilter</filter-name>

? ???? <url-pattern>/*</url-pattern>

? </filter-mapping>


??? <servlet>

?????? <servlet-name>dispatcherServlet</servlet-name>

?????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>


?????? <init-param>

?????????? <param-name>contextConfigLocation</param-name>

?????????? <param-value>classpath:spring-*.xml</param-value>

?????? </init-param>

?????? <!-- 項目啟動的時候璧针,就加載spring容器 -->

?????? <load-on-startup>1</load-on-startup>

??? </servlet>


??? <servlet-mapping>

?????? <servlet-name>dispatcherServlet</servlet-name>


?????? <!-- 把請求路徑偽靜態(tài)話,方便做seo搜索引擎優(yōu)化渊啰,有利于做網站推廣 -->

?????? <url-pattern>*.html</url-pattern>

??? </servlet-mapping>

</web-app>


[if !supportLists]1.3.3.4????[endif]第四步:導入jsp頁面探橱、靜態(tài)資源

說明:(1)靜態(tài)資源放在/webapp目錄

????????(2)jsp放到/WEB-INF/JSP目錄下

[if !vml]

[endif]


[if !supportLists]1.3.3.5????[endif]第五步:Spring整合SpringMVC

從ego-rest工程拷貝,修改部分配置即可绘证。

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

??? xmlns:context="http://www.springframework.org/schema/context"

??? xmlns:mvc="http://www.springframework.org/schema/mvc"

??? xsi:schemaLocation="http://www.springframework.org/schema/mvc

? http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd

?????? http://www.springframework.org/schema/beans? http://www.springframework.org/schema/beans/spring-beans.xsd

?????? http://www.springframework.org/schema/context? http://www.springframework.org/schema/context/spring-context-4.1.xsd">


??? <!-- 開啟注解掃描 -->

??? <context:component-scanbase-package="cn.gzsxt.portal"/>

??? <!-- 開啟注解驅動 -->

??? <mvc:annotation-driven/>


??? <!-- 由于jsp存放路徑在WEB-INF下面隧膏,默認視圖解析器解析不到,需要自己配一個視圖解析器 -->

??? <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">

?????? <propertyname="prefix"value="/WEB-INF/jsp/"></property>

?????? <propertyname="suffix"value=".jsp"></property>

??? </bean>


</beans>


[if !supportLists]1.3.3.6????[endif]第六步:整合測試

需求:訪問門戶系統(tǒng)首頁嚷那。


(1)創(chuàng)建PageController類

package cn.gzsxt.portal.controller;


import org.springframework.stereotype.Controller;

import? org.springframework.web.bind.annotation.RequestMapping;


@Controller

public class PageController {


??? @RequestMapping("/index")

??? public String showIndex(){


?????? return "index";

??? }

}


(2)更新項目胞枕、安裝到本地倉庫。(update魏宽、clean腐泻、install)

(3)啟動項目

[if !vml]

[endif]


(4)訪問首頁决乎,地址:http://localhost:8082

[if !vml]

[endif]


前臺系統(tǒng)搭建成功!E勺构诚!


[if !supportLists]2????????????[endif]首頁導航菜單實現(xiàn)

說明:首頁導航菜單,是通過異步加載實現(xiàn)的铆惑。

好處:只有當展開導航菜單時范嘱,才會發(fā)送請求,從而節(jié)約cpu資源员魏。


[if !supportLists]2.1?????????[endif]實現(xiàn)流程

[if !vml]

[endif]


需要解決的問題:

(1)在rest系統(tǒng)中發(fā)布接口丑蛤,封裝導航菜單成json格式數(shù)據(jù)。

(2)在portal系統(tǒng)中撕阎,遠程請求接口(跨域請求)受裹。


[if !supportLists]2.2?????????[endif]跨越請求

[if !supportLists]2.2.1????????[endif]什么是跨域(兩個不同系統(tǒng)之間的訪問、調用)

(1)域名不同闻书,即兩個不同的應用名斟。

[if !vml]

[endif]


(2)域名相同,但是端口不同魄眉,即同一個應用中的不同子系統(tǒng)砰盐。

[if !vml]

[endif]


[if !supportLists]2.2.2????????[endif]Ajax跨域請求的缺陷

在ego-rest系統(tǒng)使用靜態(tài)數(shù)據(jù),模擬Ajax的跨域問題坑律。


[if !supportLists]2.2.2.1????[endif]第一步:在ego-rest中添加category.json文件岩梳。(已實現(xiàn))

[if !supportLists]2.2.2.2????[endif]第二步:在ego-portal中發(fā)送ajax請求

(1)創(chuàng)建testJsonp.jsp頁面

<%@pagelanguage="java"contentType="text/html;

? charset=UTF-8"

??? pageEncoding="UTF-8"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTD

? HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<scripttype="text/javascript"src="/js/jquery-1.6.4.js"></script>

<title>Insert title here</title>

</head>

<body>

<textareaid="text"style="width: 1200px; height: 200px;"></textarea>

<inputtype="button"value="測試異步跨越"onclick="testajax()"? />

<scripttype="text/javascript">

??? function testajax(){

?????? $.ajax({

?????????? url:"http://localhost:8081/category.json",

?????????? type:"GET",

?????? ??? success:function (data) {

????????????? $("#text").val(JSON.stringify(data));

?????????? }

?????? });

??? }

</script>

</body>

</html>


(2)修改PageController,新增訪問非首頁的方法晃择。

@RequestMapping("/{page}")

public String showPage(@PathVariable("page")String page){


??? return page;

}


[if !supportLists]2.2.2.3????[endif]第三步:測試Ajax跨越

(1)重啟啟動ego-portal系統(tǒng)冀值,訪問testJsonp.jsp

[if !vml]

[endif]

(2)點擊按鈕,發(fā)送異步請求

[if !vml]

[endif]


測試發(fā)現(xiàn)宫屠,Ajax跨越請求失敗了列疗。


[if !supportLists]2.2.3????????[endif]解決方案:jsonp跨域

在前面的測試中,我們發(fā)現(xiàn)Ajax跨越請求時浪蹂,json數(shù)據(jù)被瀏覽器禁用了抵栈。

原因:瀏覽器禁止遠程加載Json數(shù)據(jù)。(瀏覽器安全機制)


如何解決呢坤次?

答:使用Jsonp方式古劲。


[if !supportLists]2.2.3.1????[endif]Jsonp原理

Jsonp實現(xiàn)的前提:

瀏覽器允許跨越加載同源數(shù)據(jù)。

即在JavaScript腳本中發(fā)送請求缰猴,就可以遠程加載js格式數(shù)據(jù)产艾。


請求原理:

(1)異步請求的時候,加上一個名為callback的回調函數(shù)

(2)在接口中,將返回的json格式數(shù)據(jù)闷堡,偽裝成js腳本格式隘膘。

(3)得到js格式數(shù)據(jù)后,提取里面的json數(shù)據(jù)缚窿。

[if !vml]

[endif]


[if !supportLists]2.2.3.2????[endif]測試Jsonp

(1)修改testJsonp.jsp棘幸,指定異步請求為jsonp方式。

<scripttype="text/javascript">

??? function testajax(){

?????? $.ajax({

?????????? url:"http://localhost:8081/category.json",

?????????? type:"GET",

?????????? dataType:"jsonp",??

? //jsonp請求

?????????? jsonp:"callbackFunction",?

? //請求參數(shù)名

?????????? jsonpCallback:"showData",?

? //回調函數(shù)名稱

?????? ??? success:function (data) {

????????????? $("#text").val(JSON.stringify(data));

?????????? }

?????? });

??? }

</script>


(2)在ego-rest工程中倦零,修改category.json文件误续,將返回數(shù)據(jù)包裝成js腳本。

[if !vml]

[endif]


(3)再次發(fā)送ajax異步請求扫茅,使用jsonp方式

[if !vml]

[endif]


結論:(1)jsonp是ajax技術中的一種異步請求方式蹋嵌。

???? (2)jsonp能實現(xiàn)跨越請求。

???? (3)jsonp跨越時葫隙,需要指定一個回調函數(shù)栽烂,并使用該函數(shù)將返回的數(shù)據(jù)偽裝成js腳本。

???? (4)獲取返回的js腳本后恋脚,jsonp自動提取其中的json數(shù)據(jù)腺办。


[if !supportLists]2.3?????????[endif]首頁導航菜單實現(xiàn)

思路:

(1)在rest工程中,開發(fā)接口糟描,返回js格式數(shù)據(jù)怀喉。(參考category.json)

(2)在portal工程中,修改jsonp請求路徑船响。請求rest接口躬拢。


[if !supportLists]2.3.1????????[endif]第一部分:在rest工程中開發(fā)導航菜單接口

[if !supportLists]2.3.1.1????[endif]第一步:定義導航菜單POJO

導航菜單結構分析。(使用JsonViewer工具查看category.json)

[if !vml]

[endif]


結論:(1)需要定義兩個POJO:菜單POJO见间、父目錄節(jié)點POJO

???? (2)導航菜單的數(shù)據(jù)聊闯,是一次加載出來的。


創(chuàng)建菜單Menu類米诉。(ego-base中創(chuàng)建)

package cn.gzsxt.base.pojo;


import java.util.List;


/**

?*自定義導航菜單

?*@authorccnulyq

?*

?*/

public class Menu {


??? private List<?> data;? //目錄節(jié)點


??? public List<?> getData() {

?????? return data;

??? }


??? public void setData(List<?> data) {

?????? this.data = data;

??? }


??? public Menu() {

?????? super();

??? }

}


創(chuàng)建父目錄節(jié)點MenuNode類

package cn.gzsxt.base.pojo;


import java.util.List;


/**

?*自定義目錄節(jié)點結構

?*@authorccnulyq

?*

?*/

public class MenuNode {


??? private String u;??? //目錄的鏈接


??? private String n;??? //目錄的名稱


??? private List<?> i;?? //當請目錄的子目錄


??? public MenuNode() {

?????? super();

??? }

//

? 補全get菱蔬、set方法

}

?

(3)重新編譯ego-base工程,安裝到本地倉庫史侣。(maven clean汗销、maven install


[if !supportLists]2.3.1.2????[endif]第二步:創(chuàng)建ItemCatService接口及其實現(xiàn)類

package cn.gzsxt.rest.service.impl;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import cn.gzsxt.base.mapper.ItemCatMapper;

import cn.gzsxt.base.pojo.ItemCat;

import cn.gzsxt.base.vo.Menu;

import cn.gzsxt.base.vo.MenuNode;

import cn.gzsxt.rest.service.ItemCatService;


@Service

public class ItemCatServiceImpl implements ItemCatService{


??? @Autowired

??? private ItemCatMapper itemCatMapper;


??? @Override

??? public Menu initMenu() {


?????? Menumenu = new Menu();


?????? //從返回值Menu的形式上來看,就是把一級目錄查詢出來即可抵窒。因此定義一個查詢方法,通過parent_id=0查詢一級目錄

?????? Listnodes = getNodesByParantId(0L);

?????? menu.setData(nodes);


?????? return menu;

??? }


??? //根據(jù)父目錄的id叠骑,查詢子目錄

??? private List getNodesByParantId(long parentId) {


?????? Mapparams = new HashMap<>();

?????? params.put("parent_id", parentId);


?????? ListselectByMap = itemCatMapper.selectByMap(params);


?????? Listnodes = new ArrayList<>();


?????? MenuNodenode = null;

?????? for (ItemCat itemCat : selectByMap) {

?????????? if(1==itemCat.getIsParent()){

????????????? node = new MenuNode();


????????????? node.setU("/products/"+itemCat.getId()+".html");????

? //u :

? "/products/1.html"

????????????? node.setN("<a href='/products/"+itemCat.getId()+".html'>"+itemCat.getName()+"</a>");???? //n : "<a href='/products/1.html'>圖書李皇、音像、電子書刊</a>"

????????????? node.setI(getNodesByParantId(itemCat.getId()));?


????????????? nodes.add(node);


?????????? }else{

?????????? ??? nodes.add("/products/"+itemCat.getId()+".html|"+itemCat.getName());???? //[3] : "/products/6.html|多媒體圖書"

?????????? }

?????? }


?????? return nodes;

??? }

}


[if !supportLists]2.3.1.3????[endif]第三步:創(chuàng)建ItemCatController類

說明:需要將返回值,包裝成js腳本數(shù)據(jù)掉房。


(1)方式一:手動封裝

package cn.gzsxt.rest.controller;


import? org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.MediaType;

import org.springframework.stereotype.Controller;

import? org.springframework.web.bind.annotation.RequestMapping;

import? org.springframework.web.bind.annotation.ResponseBody;

import cn.gzsxt.base.utils.JsonUtils;

import cn.gzsxt.base.vo.Menu;

import cn.gzsxt.rest.service.ItemCatService;


@Controller

public class ItemCatController {


??? @Autowired

??? private ItemCatService catService;


??? /*

??? ?*jsonp方法下茧跋,返回值,要使用回調函數(shù)來偽裝js腳本

??? ?* @return

??? ?*/

??? @RequestMapping(value="/item/all",produces=MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8")

??? @ResponseBody

??? public String getMenu(String callback){

?????? Menumenu = catService.initMenu();

?????? StringjsonMenu= JsonUtils.objectToJson(menu);

?????? StringjsMenu = callback+"("+jsonMenu+")";


?????? return jsMenu;

??? }

}


(2)方式二:使用MappingJacksonValue對象封裝

//使用MappingJacksonValue對象包裝返回結果卓囚,并設置jsonp的回調方法

??? @RequestMapping("/item/all")

??? @ResponseBody

??? public MappingJacksonValue

? queryAll(String callback) {

?????? //查詢分類列表

?????? Menumenu = catService.getMenu();

?????? //包裝jsonp

?????? MappingJacksonValuejacksonValue = new MappingJacksonValue(menu);

?????? //設置包裝的回調方法名

?????? jacksonValue.setJsonpFunction(callback);

?????? return jacksonValue;

??? }


[if !supportLists]2.3.1.4????[endif]第四步:測試接口

在瀏覽器訪問瘾杭。

地址:http://localhost:8081/rest/item/all?callback=category.getDataService

[if !vml]

[endif]


[if !supportLists]2.3.2????????[endif]第二部分:在portal工程中調用導航菜單接口

[if !supportLists]2.3.2.1????[endif]第一步:指定請求方式為jsonp

(1)修改lib-v1.js文件,指定導航菜單接口地址哪亿。

[if !vml]

[endif]


(2)修改lib-v1.js文件粥烁,指定請求方式為jsonp。

[if !vml]

[endif]


[if !supportLists]2.3.2.2????[endif]第二步:測試導航菜單

(1)重啟portal工程

(2)訪問首頁蝇棉,請求導航菜單

[if !vml]

[endif]

導航菜單開發(fā)成功L肿琛!篡殷!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钝吮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子板辽,更是在濱河造成了極大的恐慌奇瘦,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劲弦,死亡現(xiàn)場離奇詭異耳标,居然都是意外死亡,警方通過查閱死者的電腦和手機瓶您,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門麻捻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呀袱,你說我怎么就攤上這事贸毕∑驶停” “怎么了端姚?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牵啦。 經常有香客問我寇僧,道長摊腋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任嘁傀,我火速辦了婚禮兴蒸,結果婚禮上,老公的妹妹穿的比我還像新娘细办。我一直安慰自己橙凳,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岛啸,像睡著了一般钓觉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坚踩,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天荡灾,我揣著相機與錄音,去河邊找鬼瞬铸。 笑死批幌,一個胖子當著我的面吹牛,可吹牛的內容都是我干的赴捞。 我是一名探鬼主播逼裆,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赦政!你這毒婦竟也來了胜宇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤恢着,失蹤者是張志新(化名)和其女友劉穎桐愉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掰派,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡从诲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了靡羡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片系洛。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖略步,靈堂內的尸體忽然破棺而出描扯,到底是詐尸還是另有隱情,我是刑警寧澤趟薄,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布绽诚,位于F島的核電站,受9級特大地震影響杭煎,放射性物質發(fā)生泄漏恩够。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一羡铲、第九天 我趴在偏房一處隱蔽的房頂上張望蜂桶。 院中可真熱鬧,春花似錦也切、人聲如沸屎飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钦购。三九已至,卻和暖如春褂萧,著一層夾襖步出監(jiān)牢的瞬間押桃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工导犹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唱凯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓谎痢,卻偏偏與公主長得像磕昼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子节猿,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容