1 案例实现
1.1 原型分析
1.2 系统架构
2 工程搭建
2.1 加入jar包
创建一个web工程导入jar包
1、springmvc的相关jar包
2、solrJ的jar包
3、Example\lib\ext下的jar包
2.2 springmvc.xml(配置solr)
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 扫描基本包 @Controller @Service @Respostory --> <context:component-scan base-package="com.itheima"/> <!-- 三大组件 --> <mvc:annotation-driven/> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 配置SOlrJ --> <bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer"> <constructor-arg value="http://192.168.25.101:8080/solr/collection1"/> </bean> </beans>
2.3 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 解决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>jd</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jd</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
3 代码
3.1 Pojo
3.1.1 商品对象模型:ProductModel
商品对象模型:ProductModel
public classProductModel {
// 商品编号
private String pid;
// 商品名称
private String name;
// 商品分类名称
private String catalog_name;
// 价格
private float price;
// 商品描述
private String description;
// 图片名称
private String picture;
}
3.1.2 接受模型QueryVo
public class QueryVo {
//关键词
private String queryString;
//过滤条件商品类型
//价格区间
private String catalog_name;
privateString price;
//排序 1 正 0倒
privateString sort;
3.2 Dao
3.2.1 功能分析
功能:接收service层传递过来的参数,根据参数查询索引库,返回查询结果。
参数:SolrQuery对象
返回值:一个商品列表List<ProductModel>。
方法定义:publicList<ProductModel> getResultModelFromSolr(QueryVo vo) throws Exception;
商品对象模型: ProductModel
3.2.2 代码实现
@Repository public class JdDaoImpl implements JdDao { // 索引库 @Autowired private SolrServer solrServer; 通过上面四个条件查询对象商品结果集 public List<ProductModel> selectProductModelListByQuery(QueryVo vo) throws Exception { // 查询 关键词 过滤条件 // 价格排序 分页 开始行 每页数 高亮 默认域 只查询指定域 SolrQuery solrQuery = new SolrQuery(); // 关键词 solrQuery.setQuery(vo.getQueryString()); // 过滤条件 String catalog_name = vo.getCatalog_name(); if(null != catalog_name && !"".equals(catalog_name)){ solrQuery.set("fq", "product_catalog_name:" + catalog_name); } String price = vo.getPrice(); if(null != price && !"".equals(price)){ //0-9 50-* String[] p = price.split("-"); solrQuery.set("fq", "product_price:[" + p[0] + " TO " + p[1] + "]"); } // 价格排序 String sort = vo.getSort(); if("1".equals(sort)){ solrQuery.addSort("product_price", ORDER.desc); }else{ solrQuery.addSort("product_price", ORDER.asc); } // 分页 solrQuery.setStart(0); solrQuery.setRows(16); // 默认域 solrQuery.set("df", "product_keywords"); // 只查询指定域 solrQuery.set("fl", "id,product_name,product_price,product_picture"); // 高亮 // 打开开关 solrQuery.setHighlight(true); // 指定高亮域 solrQuery.addHighlightField("product_name"); // 前缀 solrQuery.setHighlightSimplePre("<span style='color:red'>"); solrQuery.setHighlightSimplePost("</span>"); // 后缀 // 执行查询 QueryResponse response = solrServer.query(solrQuery); // 文档结果集 SolrDocumentList docs = response.getResults(); Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); // Map K id V Map // Map K 域名 V List // List list.get(0) // 总条数 long numFound = docs.getNumFound(); List<ProductModel> productModels = new ArrayList<ProductModel>(); for (SolrDocument doc : docs) { ProductModel productModel = new ProductModel(); productModel.setPid((String) doc.get("id")); productModel.setPrice((Float) doc.get("product_price")); productModel.setPicture((String) doc.get("product_picture")); Map<String, List<String>> map = highlighting.get((String) doc.get("id")); List<String> list = map.get("product_name"); productModel.setName(list.get(0)); productModels.add(productModel); } return productModels; } }
3.3 Service
3.3.1 功能分析
功能:接收action传递过来的参数,根据参数拼装一个查询条件,调用dao层方法,查询商品列表。接收返回的商品列表和商品的总数量,根据每页显示的商品数量计算总页数。
参数:
1、查询条件:字符串
2、商品分类的过滤条件:商品的分类名称,字符串
3、商品价格区间:传递一个字符串,满足格式:“0-100、101-200、201-*”
4、排序条件:页面传递过来一个升序或者降序就可以,默认是价格排序。0:升序1:降序
5、分页信息:每页显示的记录条数创建一个常量60条。传递一个当前页码就可以了。
业务逻辑
1、根据参数创建查询对象
2、调用dao执行查询。
3、根据总记录数计算总页数。
返回值:ResultModel
方法定义:ResultModelqueryProduct(String queryString, String caltalog_name, String price, Stringsort, Integer page) throws Exception;
3.3.2 代码实现
@Service
public class JdServiceImpl implements JdService {
@Autowired
private JdDao jdDao;
//通过上面四个条件查询对象商品结果集
public List<ProductModel>selectProductModelListByQuery(QueryVo vo) throws Exception{
return jdDao.selectProductModelListByQuery(vo);
}
}
3.4 Controller
3.4.1 功能分析
功能:接收页面传递过来的参数调用service查询商品列表。将查询结果返回给jsp页面,还需要查询参数的回显。
参数:
1、查询条件:字符串
2、商品分类的过滤条件:商品的分类名称,字符串
3、商品价格区间:传递一个字符串,满足格式:“0-100、101-200、201-*”
4、排序条件:页面传递过来一个升序或者降序就可以,默认是价格排序。0:升序1:降序
5、分页信息:每页显示的记录条数创建一个常量60条。传递一个当前页码就可以了。
6、Model:相当于request。
返回结果:String类型,就是一个jsp的名称。
public class QueryVo
3.4.2 代码实现
/**
* 查询商品列表
*/
@Controller
public class ProductController {
@Autowired
private JdService jdService;
//搜索
@RequestMapping("/list.action")
public Stringlist(QueryVo vo, Model model) throws Exception{
//结果集
List<ProductModel> productModels = jdService.selectProductModelListByQuery(vo);
model.addAttribute("productModels", productModels);
model.addAttribute("catalog_name", vo.getCatalog_name());
model.addAttribute("price", vo.getPrice());
model.addAttribute("sort", vo.getSort());
model.addAttribute("queryString", vo.getQueryString());
return "product_list";
}
}