在taotao-search-web工程需要添加对Search服务的引用,如下图所示。
springmvc.xml文件所有代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:resource/resource.properties"/>
<!-- 配置注解驱动 -->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置包扫描器,扫描@Controller注解的类 -->
<context:component-scan base-package="com.taotao.search.controller"/>
<!-- 引用dubbo服务 -->
<dubbo:application name="taotao-search-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.156.14:2181"/>
<dubbo:reference interface="com.taotao.search.service.SearchService" id="searchService" />
</beans>
下面我们写一个Controller,如下图所示。
Controller代码如下:
package com.taotao.search.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.taotao.common.pojo.SearchResult;
import com.taotao.search.service.SearchService;
@Controller
public class SearchController {
@Autowired
private SearchService searchService;
@Value("${SEARCH_RESULT_ROWS}")
private Integer SEARCH_RESULT_ROWS;
@RequestMapping("/search")
public String search(@RequestParam("q") String queryString,
@RequestParam(defaultValue="1") Integer page,Model model){
try {
//调用服务执行查询
SearchResult searchResult = searchService.search(queryString, page, SEARCH_RESULT_ROWS);
//把结果传递给页面
model.addAttribute("query", queryString);
model.addAttribute("totalPages", searchResult.getTotalPages());
model.addAttribute("itemList", searchResult.getItemList());
model.addAttribute("page", page);
} catch (Exception e) {
e.printStackTrace();
}
//返回逻辑视图
return "search";
}
}
下面对Controller当中代码做下解释并需要在配置文件配置下每页显示数量。
首先,@RequestMapping("/search")的值为何是"/search",这要从搜索页面代码说起,在search.jsp页面当中是没有搜索代码的,搜索代码在commons/header.jsp当中。
我们打开commons目录下的header.jsp页面,可以看到当我们在搜索框中输入搜索条件并按回车后会触发search方法,这个search方法并不在这个header.jsp当中,而是在引用的base-v1.js当中。
我们到base-v1.js当中,找到search方法,在search方法中,我们可以看到要访问的页面是search.html,我们的taotao-search-web工程拦截的就是以".html"结尾的文件,因此没有问题,既然要请求search.html,我们当然要拦截的是"search"了。另外,大家在这里也看到了,请求后面的参数是以"q"来携带的,这个变量名字与我们Controller当中定义的参数名称"queryString"不一致,名称不一致的情况需要指定映射关系,于是便有了@RequestParam("q") String queryString。
我们从上图的请求当中可以看到也没有每页显示多少条的参数,而这个参数必须是灵活可配置的,因此最好写到配置文件当中。如下图所示。
search方法中的Model参数是为了向页面回显数据用的,我们可以看下搜索页面都需要回显哪些数据,可以看到有四个值需要回显,这也刚好对应着我们在Controller类中所回显的四个变量。
方法最后返回逻辑视图"search"经过spring自动添加后缀.jsp,于是便去访问这个search.jsp页面,并把四个变量也都带过来了,这样,页面便可以正常显示数据了。
好了,至此,我们的Controller便完成了。