大广告展示方案
方案一
- jsonp**跨域请求**,从首页ajax跨域调用服务层服务。
- 优点:
- 缺点:
- 不利于搜索引擎优化(seo优化)。网页中无广告内容,需要延时加载。
方案二
- 通过门户工程的后台java代码调用服务层服务。
- 优点:
- 有利于搜索引擎优化。网页的广告内容是动态的。
- 可以在门户工程的后台对数据进行加工。
- 缺点:
- 效率较低。需要后台中转,但是由于门户工程和服务层通常在一个局域网,效率损失可以忽略。
- 这里使用方案二。
内容服务发布
需求
- 在taotao-rest中开发,需要根据内容分类的id查询内容列表。
- 请求url:/rest/content/list/{categoryId}
- 请求参数:内容分类id
- 响应内容:TaotaoResult,包含对应分类id的内容列表
Service层
- 创建ContentService接口和对应的实现类,根据内容分类id,查询内容列表。
@Service
public class ContentServiceImpl implements ContentService {
@Autowired
private TbContentMapper contentMapper;
@Override
public List<TbContent> getContentList(long catagroyId) {
TbContentExample example = new TbContentExample();
Criteria criteria = example.createCriteria();
criteria.andCategoryIdEqualTo(catagroyId);
List<TbContent> list = contentMapper.selectByExample(example);
return list;
}
}
Controller层
- 创建ContentController,接收内容分类id,调用服务层,响应TaoTaoResult的json。
@Controller
@RequestMapping("/content")
public class ContentController {
@Autowired
private ContentService contentService;
@RequestMapping("/list/{categoryId}")
@ResponseBody
public TaotaoResult getContentList(@PathVariable Long categoryId) {
try {
List<TbContent> list = contentService.getContentList(categoryId);
return TaotaoResult.ok(list);
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
}
}
大广告展示
需求
分析
- 在首页接收名为 ad1 的参数,之后进行大广告位轮播图的初始化。
- ad1的格式为json。
[
{
"srcB": "http://192.168.57.137/2018/04/02/1522635519043822.jpg",
"height": 240,
"alt": "",
"width": 670,
"src": "http://192.168.57.137/2018/04/02/1522635519043822.jpg",
"widthB": 550,
"href": "http://www.baidu.com",
"heightB": 240
},
{
"srcB": "http://192.168.57.137/2018/04/02/1522635645049041.jpg",
"height": 240,
"alt": "",
"width": 670,
"src": "http://192.168.57.137/2018/04/02/1522635645049041.jpg",
"widthB": 550,
"href": "http://www.baidu.com",
"heightB": 240
},
{
"srcB": "http://192.168.57.137/2018/04/02/1522635440598537.jpg",
"height": 240,
"alt": "",
"width": 670,
"src": "http://192.168.57.137/2018/04/02/1522635440598537.jpg",
"widthB": 550,
"href": "http://www.baidu.com",
"heightB": 240
}
]
总结
- 在taotao-portal中开发,需要修改页面跳转控制器,视图模型中加入包含大广告位内容的属性,之后返回首页。
- 请求url:/rest/index
- 请求参数:无
- 响应参数:包含ad1属性的首页视图,ad1属性为大广告位需求的json。
Service层
- 创建IndexAd这一pojo,包括大广告位要求的8个属性。
- 在resource的rest.properties中添加服务层参数。大广告位的分类id为89。
#服务层基础url
REST_BASE_URL=http:
#首页大广告位url
INDEX_AD_URL=/content/list/89
- 创建ContentService接口和对应实现类,使用httpclient调用rest层服务,获取大广告的内容列表,并重新组织封装在IndexAd列表中。
@Service
public class ContentServiceImpl implements ContentService {
private static final Integer HEIGHT = 240;
private static final Integer WIDTH = 670;
private static final Integer WIDTH_B = 550;
@Value("${REST_BASE_URL}")
private String REST_BASE_URL;
@Value("${INDEX_AD_URL}")
private String INDEX_AD_URL;
@Override
public List<IndexAd> getIndexAdList() {
List<IndexAd> indexAdList = new ArrayList<>();
try {
String restJson = HttpClientUtil.doGet(REST_BASE_URL + INDEX_AD_URL);
TaotaoResult taotaoResult = TaotaoResult.formatToList(restJson, TbContent.class);
List<TbContent> contentList = (List<TbContent>) taotaoResult.getData();
for (TbContent content : contentList) {
IndexAd indexAd = new IndexAd();
indexAd.setSrc(content.getPic());
indexAd.setHeight(HEIGHT);
indexAd.setWidth(WIDTH);
indexAd.setSrcB(content.getPic2());
indexAd.setWidthB(WIDTH_B);
indexAd.setHeightB(HEIGHT);
indexAd.setHref(content.getUrl());
indexAd.setAlt(content.getSubTitle());
indexAdList.add(indexAd);
}
return indexAdList;
} catch (Exception e) {
e.printStackTrace();
}
return indexAdList;
}
}
Controller层
- 需要修改PageController,调用service层,将indexAd列表json化,赋值给首页视图的ad1属性。
- ad1属性不能直接使用对象,因为没有序列化的对象只能包含引用,类似浅复制。
@Controller
public class PageController {
@Autowired
private ContentService contentService;
@RequestMapping("/index")
public String showIndex(Model model) {
List<IndexAd> indexAdList = contentService.getIndexAdList();
model.addAttribute("ad1", JsonUtils.objectToJson(indexAdList));
return "index";
}
}
运行项目
- 需要同时运行portal,rest模块,以及图片服务器。
- 访问localhost:8082。