Solr
全文搜索服务
1 Solr介绍
1.1 什么是solr
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:
* 创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr服务器根据xml文档添加、删除、更新索引 。
* 搜索索引:客户端(可以是浏览器可以是Java程序)用 GET方法向 Solr 服务器发送请求,然后对Solr服务器返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建页面UI的功能,但是Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
1.2 Solr和Lucene的区别
Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索应用。Lucene仅提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索应用。
Solr的目标是打造一款企业级的搜索引擎系统,它是基于Lucene一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。
2 Solr安装配置
2.1 下载solr
Solr和lucene的版本是同步更新的,最新的版本是5.2.1
本课程使用的版本:4.10.3
下载地址:http://archive.apache.org/dist/lucene/solr/
下载版本:4.10.3
Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。
下载lucene-4.10.3.zip并解压:
bin:solr的运行脚本
contrib:solr的一些扩展jar包,用于增强solr的功能。
dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
docs:solr的API文档
example:solr工程的例子目录:
l example/solr:
该目录是一个标准的SolrHome,它包含一个默认的SolrCore
l example/multicore:
该目录包含了在Solr的multicore中设置的多个Core目录。
l example/webapps:
该目录中包括一个solr.war,该war可作为solr的运行实例工程。
licenses:solr相关的一些许可信息
2.2 运行环境
solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),本教程使用Tocmat作为Servlet容器,相关环境如下:
l Solr:4.10.3
l Jdk环境:1.7.0_72(solr4.10 不能使用jdk1.7以下)
l Web服务器(servlet容器):Tomcat 7X
2.3 SolrCore配置
2.3.1 SolrHome和SolrCore
SolrHome是Solr运行的主目录,该目录中包括了多个SolrCore目录。SolrCore目录中包含了运行Solr实例所有的配置文件和数据文件,Solr实例就是SolrCore。
一个SolrHome可以包括多个SolrCore(Solr实例),每个SolrCore提供单独的搜索和索引服务。
2.3.2 目录结构
SolrHome目录:
SolrCore目录:
2.3.3 创建SolrCore
创建SolrCore先要创建SolrHome。在solr解压包下solr-4.10.3\example\solr文件夹就是一个标准的SolrHome。
l 拷贝solr解压包下solr-4.10.3\example\solr文件夹。
l 复制该文件夹到本地的一个目录,把文件名称改为solrhome。
注:改名不是必须的,只是为了便于理解
l 打开SolrHome目录
SolrCore创建成功。
2.3.4 配置SolrCore
在conf文件夹下有一个solrconfig.xml。这个文件是来配置SolrCore实例的相关信息。如果使用默认配置可以不用做任何修改。它里面包含了不少标签,但是我们关注的标签为:lib标签、datadir标签、requestHandler标签。
2.3.4.1 lib 标签
在solrconfig.xml中可以加载一些扩展的jar,solr.install.dir表示solrCore的目录位置,需要如下修改:
然后将contrib和dist两个目录拷贝到E:\12-solr\0505下
2.3.4.2 datadir标签
每个SolrCore都有自己的索引文件目录 ,默认在SolrCore目录下的data中。
data数据目录下包括了index索引目录 和tlog日志文件目录。
如果不想使用默认的目录也可以通过solrConfig.xml更改索引目录 ,如下:
2.3.4.3 requestHandler标签
requestHandler请求处理器,定义了索引和搜索的访问方式。
通过/update维护索引,可以完成索引的添加、修改、删除操作。
提交xml、json数据完成索引维护,索引维护小节详细介绍。
通过/select搜索索引。
设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下:
explicit
10
json
text
2.4 Solr工程部署
由于在项目中用到的web服务器大多数是用的Tomcat,所以就讲solr和Tomcat的整合。
2.4.1 安装Tomcat
2.4.2 把solr.war部署到Tomcat中
1、 从solr解压包下的solr-4.10.3\example\webapps目录中拷贝solr.war
2、 复制到tomcat安装目录的webapps文件夹下
2.4.3 解压缩solr.war
使用压缩工具解压或者启动tomcat自动解压。解压之后删除solr.war
2.4.4 添加solr服务的扩展依赖包(日志包)
l 把solr解压包下的solr-4.10.3\example\lib\ext目录下的所有jar包拷贝。
l 复制到解压缩后的solr工程的WEB-INF\lib目录
2.4.5 添加log4j.properties
1、 把solr解压包下solr-4.10.3\example\resources\log4j.properties文件进行拷贝
2、 在解压缩后的solr工程中的WEB-INF目录中创建classes文件夹
3、 复制log4j.properties文件到刚创建的classes目录
2.4.6 在solr应用的web.xml文件中,加载SolrHome
修改web.xml使用jndi的方式告诉solr服务器。
Solr/home名称必须是固定的。
2.4.7 启动Tomcat进行访问
访问http://localhost:8080/solr/
出现以下界面则说明solr安装成功!!!
2.5 管理界面功能介绍
2.5.1 Dashboard
仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。
2.5.2 Logging
Solr运行日志信息
2.5.3 Cloud
Cloud即SolrCloud,即Solr云(集群),当使用SolrCloud模式运行时会显示此菜单,该部分功能在第二个项目,即电商项目会讲解。
2.5.4 Core Admin
Solr Core的管理界面。在这里可以添加SolrCore实例。
2.5.5 java properties
Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。
2.5.6 Tread Dump
显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。
2.5.7 Core selector(重点)
选择一个SolrCore进行详细操作,如下:
2.5.7.1 Analysis(重点)
通过此界面可以测试索引分析器和搜索分析器的执行情况。
注:solr中,分析器是绑定在域的类型中的。
2.5.7.2 dataimport
可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。
默认没有配置,需要手工配置。
2.5.7.3 Document(重点)
通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。
通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:
l overwrite="true" : solr在做索引的时候,如果文档已经存在,就用xml中的文档进行替换
l commitWithin="1000" : solr 在做索引的时候,每个1000(1秒)毫秒,做一次文档提交。为了方便测试也可以在Document中立即提交,后添加“”
2.5.7.4 Query(重点)
通过/select执行搜索索引,必须指定“q”查询条件方可搜索。
2.6 多solrcore配置
配置多SolrCore的好处:
1. 一个solr工程对外通过SorlCore 提供服务,每个SolrCore相当于一个数据库,这个功能就相当于一个MySQL可以运行多个数据库。
2. 将索引数据分SolrCore存储,方便对索引数据管理维护。
3. SolrCloud集群需要使用多core。
复制原来的core目录为collection2,目录结构如下:
修改collection2下的core.properties,如下:
演示多core的使用,在collection1和collection2中分别创建索引、搜索索引。
3 solr基本使用
3.1 schema.xml
schema.xml文件在SolrCore的conf目录下,它是Solr数据表配置文件,在此配置文件中定义了域以及域的类型还有其他一些配置,在solr中域必须先定义后使用。
3.1.1 field
l Name:域的名称
l Type:域的类型
l Indexed:是否索引
l Stored:是否存储
l Required:是否必须
l multiValued:是否是多值,存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图)
3.1.2 fieldType(域类型)
- <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
- <analyzer type="index">
- <tokenizer class="solr.StandardTokenizerFactory"/>
- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
-
第四步:定义field,指定field的type属性为text_ik
第五步:重启tomcat
测试:
3.3 配置业务field
3.3.1 需求
要使用solr实现电商网站中商品搜索。
电商中商品信息在mysql数据库中存储了,将mysql数据库中数据在solr中创建索引。
需要在solr的schema.xml文件定义商品Field。
3.3.2 定义步骤
先确定定义的商品document的field有哪些?
可以根据mysql数据库中商品表的字段来确定:
products商品表:
商品document的field包括:pid、name、catalog、catalog_name、price、description、picture
先定义Fieldtype:
solr本身提供的fieldtype类型够用了不用定义新的了。
再定义Field:
pid:商品id主键
使用solr本身提供的:
name:商品名称
catalog:商品分类
catalog_name:商品分类名称
price:商品价格
description:商品描述
picture:商品图片
-
- <field name="product_name" type="text_ik" indexed="true" stored="true"/>
- <field name="product_catalog" type="string" indexed="true" stored="true"/>
- <field name="product_catalog_name" type="string" indexed="true" stored="true" />
- <field name="product_price" type="float" indexed="true" stored="true"/>
- <field name="product_description" type="text_ik" indexed="true" stored="false" />
- <field name="product_picture" type="string" indexed="false" stored="true" />
- <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
3.4 dataimportHandler插件
3.4.1 第一步:添加jar包
l Dataimport的jar
从solr-4.10.3\dist目录下拷贝solr-dataimporthandler-4.10.3.jar,复制到以下目录:
修改schema.xml如下:
l 数据库驱动包
把mysql数据库驱动包,拷贝到以下目录:
修改schema.xml,如下:
3.4.2 第二步:配置solrconfig.xml,添加一个requestHandler
/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> data-config.xml |
3.4.3 第三步:创建一个data-config.xml
在collection1\conf\目录下创建data-config.xml文件
- xml version="1.0" encoding="UTF-8" ?>
- <dataConfig>
- <dataSource type="JdbcDataSource"
- driver="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/solr"
- user="root"
- password="root"/>
- <document>
- <entity name="product" query="SELECT pid,name,catalog,catalog_name,price,description,picture FROM products ">
- <field column="pid" name="id"/>
- <field column="name" name="product_name"/>
- <field column="catalog" name="product_catalog"/>
- <field column="catalog_name" name="product_catalog_name"/>
- <field column="price" name="product_price"/>
- <field column="description" name="product_description"/>
- <field column="picture" name="product_picture"/>
- entity>
- document>
-
- dataConfig>
3.4.4 第四步:重启tomcat
3.4.5 第五步:点击“execute”按钮导入数据
注意:到入数据前会先清空索引库,然后再导入。导入完成需手动刷新或者选择下面自动刷新
4 Solrj的使用
4.1 什么是solrj
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
Solrj和图形界面操作的区别就类似于数据库中你使用jdbc和mysql客户端的区别一样。
4.2 需求
使用solrj调用solr服务实现对索引库的增删改查操作。
4.3 环境准备
l Solr:4.10.3
l Jdk环境:1.7.0_72(solr4.10 不能使用jdk1.7以下)
l Ide环境:eclipse indigo
4.4 工程搭建
4.4.1 第一步:创建java工程
4.4.2 第二步:添加jar
l Solrj的包
l Solr服务的依赖包
4.5 代码实现
4.5.1 添加\修改索引
4.5.1.1 步骤
1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
2、 创建SolrInputDocument对象,然后通过它来添加域。
3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
4、 提交。
4.5.1.2 代码
说明:根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。
- @Test
- public void addDocument() throws Exception {
-
-
-
- HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
-
- SolrInputDocument document = new SolrInputDocument();
-
-
-
- document.addField("id", "c0001");
- document.addField("title_ik", "使用solrJ添加的文档");
- document.addField("content_ik", "文档的内容");
- document.addField("product_name", "商品名称");
-
- server.add(document);
-
- server.commit();
- }
4.5.1.3 查询测试
4.5.2 删除索引
4.5.2.1 根据ID删除
4.5.2.1.1代码
- @Test
- public void deleteDocument() throws Exception {
-
-
- HttpSolrServer server = new HttpSolrServer(
- "http://localhost:8080/solr/");
-
- server.deleteById("c0001");
-
- server.commit();
- }
4.5.2.1.2查询测试
4.5.2.2 根据条件删除
- @Test
- public void deleteDocumentByQuery() throws Exception {
-
-
- HttpSolrServer server = new HttpSolrServer(
- "http://localhost:8080/solr/");
-
- server.deleteByQuery("id:c0001");
-
-
-
- server.commit();
- }
4.5.3 查询索引
4.5.3.1 solr的查询语法
1. q - 查询关键字,必须的,如果查询所有使用*:*。
请求的q是字符串
2. fq- (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如::
请求fq是一个数组(多个值)
过滤查询价格从1到20的记录。
也可以在“q”查询条件中使用product_price:[1TO 20],如下:
也可以使用“*”表示无限,例如:
20以上:product_price:[20TO *]
20以下:product_price:[*TO 20]
3. sort - 排序,格式:sort=+[,+]… 。示例:
按价格降序
4. start - 分页显示使用,开始记录下标,从0开始
5. rows - 指定返回结果最多有多少条记录,配合start来实现分页。
实际开发时,知道当前页码和每页显示的个数最后求出开始下标。
6. fl - 指定返回那些字段内容,用逗号或空格分隔多个。
显示商品图片、商品名称、商品价格(不写默认返回全部配置的)
7. df-指定一个搜索Field
也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。
8. wt - (writer type)指定输出格式,可以有xml, json, PHP, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
9. hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。
4.5.3.2 简单查询
- @Test
- public void queryIndex() throws Exception {
-
-
- HttpSolrServer server = new HttpSolrServer(
- "http://localhost:8080/solr/");
-
-
- SolrQuery query = new SolrQuery();
-
- query.set("q", "id:2");
-
-
- QueryResponse response = server.query(query);
-
-
- SolrDocumentList results = response.getResults();
-
-
- long cnt = results.getNumFound();
- System.out.println("查询结果总数:" + cnt);
-
- for (SolrDocument solrDocument : results) {
- System.out.println(solrDocument.get("id"));
- System.out.println(solrDocument.get("product_name"));
- System.out.println(solrDocument.get("product_price"));
- System.out.println(solrDocument.get("product_catalog_name"));
- System.out.println(solrDocument.get("product_picture"));
-
- }
- }
4.5.3.3 复杂查询
复杂查询中包括高亮的处理
- @Test
- public void queryIndex2() throws Exception {
-
-
- HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
-
-
- SolrQuery query = new SolrQuery();
-
-
- query.setQuery("钻石");
-
- query.setFilterQueries("product_catalog_name:幽默杂货");
-
- query.setSort("product_price", ORDER.desc);
-
- query.setStart(0);
- query.setRows(10);
-
-
- query.setFields("id", "product_name", "product_price",
- "product_catalog_name", "product_picture");
-
-
- query.set("df", "product_name");
-
-
- query.setHighlight(true);
- query.addHighlightField("product_name");
- query.setHighlightSimplePre("");
- query.setHighlightSimplePost("");
-
-
- QueryResponse response = server.query(query);
-
-
- SolrDocumentList results = response.getResults();
-
-
- long cnt = results.getNumFound();
- System.out.println("查询结果总数:" + cnt);
-
- for (SolrDocument solrDocument : results) {
- System.out.println(solrDocument.get("id"));
-
- String productName = (String) solrDocument.get("product_name");
-
-
- Map>> highlighting = response
- .getHighlighting();
-
- List list = highlighting.get(solrDocument.get("id")).get(
- "product_name");
-
- if (list != null) {
- productName = list.get(0);
- }
-
- System.out.println(productName);
- System.out.println(solrDocument.get("product_price"));
- System.out.println(solrDocument.get("product_catalog_name"));
- System.out.println(solrDocument.get("product_picture"));
-
- }
- }
5 案例
5.1 需求
使用Solr实现电商网站中商品信息搜索功能,可以根据关键字、分类、价格搜索商品信息,也可以根据价格进行排序。
界面如下:
5.2 分析
开发人员需要的文档:静态页面(根据UI设计由美工给出)、数据库设计、原型设计
5.2.1 UI分析
5.2.2 架构分析
架构分为:
1、 solr服务器
2、 自己开发的应用(重点)
3、 数据库mysql
业务流程
自己开发的应用
1、 Controller
和前端页面进行请求和响应的交互
2、 Service
使用solrj来调用solr的服务进行索引和搜索
Service调用dao进行商品数据的维护时,要同步更新索引库
3、 Dao
对商品数据进行维护和查询
5.3 环境准备
l Solr:4.10.3
l Jdk环境:1.7.0_72(solr4.10 不能使用jdk1.7以下)
l Ide环境:eclipse indigo
l Web服务器(servlet容器):Tomcat 7X
5.4 工程搭建
5.4.1 第一步:创建web工程
5.4.2 第二步:添加jar包
l Solrj的包
l Solr服务的日志包
l spring的包(包含springmvc)
l Jstl包
l Commons日志包
5.5 代码实现
5.5.1 Pojo
5.5.1.1 分析
索引查询结果
通过分析得出:
l 需要一个商品的pojo(Product),存放商品信息
l 还需要一个包装pojo(ResultModel),它包括商品列表信息、商品分页信息
5.5.1.2 代码
Product.java
public class Product { // 商品编号 private Stringpid; // 商品名称 private Stringname; // 商品分类名称 private Stringcatalog_name; // 价格 private float price; // 商品描述 private Stringdescription; // 图片名称 private String picture; } |
ResultModel.java
public class ResultModel { // 商品列表 private ListproductList; // 商品总数 private LongrecordCount; // 总页数 private int pageCount; // 当前页 private int curPage; } |
5.5.2 Dao
功能:接收service层传递过来的参数,根据参数查询索引库,返回查询结果。
public interface ProductDao { //查询商品信息,包括分页信息 public ResultModel queryProduct(SolrQuery query) throws Exception; } |
- public class ProductDaoImpl implements ProductDao {
-
- @Autowired
- private HttpSolrServer server;
-
- @Override
- public ResultModel queryProduct(SolrQuery query) throws Exception {
- ResultModel result = new ResultModel();
-
- QueryResponse response = server.query(query);
-
- SolrDocumentList documentList = response.getResults();
-
- result.setRecordCount(documentList.getNumFound());
-
- List productList = new ArrayList<>();
- Product product = null;
-
- Map>> highlighting = response
- .getHighlighting();
- for (SolrDocument solrDocument : documentList) {
- product = new Product();
- product.setPid((String) solrDocument.get("id"));
-
- String prodName = (String) solrDocument.get("product_name");
-
- List list = highlighting.get(solrDocument.get("id")).get(
- "product_name");
- if (list != null)
- prodName = list.get(0);
-
- product.setName(prodName);
- product.setCatalog_name((String) solrDocument
- .get("product_catalog_name"));
- product.setPrice((float) solrDocument.get("product_price"));
- product.setPicture((String) solrDocument.get("product_picture"));
-
- productList.add(product);
- }
-
-
- result.setProductList(productList);
- return result;
- }
-
- }
5.5.3 Service
功能:接收action传递过来的参数,根据参数拼装一个查询条件,调用dao层方法,查询商品列表。接收返回的商品列表和商品的总数量,根据每页显示的商品数量计算总页数。
public interface ProductService { public ResultModelqueryProduct(String queryString, String cataName, String price, String sort, Integer curPage) throws Exception; } |
- @Service
- public class ProductServiceImpl implements ProductService {
-
- @Autowired
- private ProductDao dao;
-
- @Override
- public ResultModel queryProduct(String queryString, String cataName,
- String price, String sort, Integer curPage) throws Exception {
-
- SolrQuery query = new SolrQuery();
-
- if (queryString != null && !"".equals(queryString)) {
- query.setQuery(queryString);
- }else{
- query.setQuery("*:*");
- }
-
- if (cataName != null && !"".equals(cataName)) {
- query.addFilterQuery("product_catalog_name:" + cataName);
- }
- if (price != null && !"".equals(price)) {
- String[] strings = price.split("-");
- if (strings.length == 2) {
- query.addFilterQuery("product_price:[" + strings[0] + " TO "
- + strings[1] + "]");
- }
- }
-
- if ("1".equals(sort)) {
- query.setSort("product_price", ORDER.desc);
- } else {
- query.setSort("product_price", ORDER.asc);
- }
-
- if (curPage == null)
- curPage = 1;
- query.setStart((curPage - 1) * Constants.rows);
- query.setRows(Constants.rows);
-
-
- query.set("df", "product_name");
-
-
- query.setHighlight(true);
- query.addHighlightField("product_name");
- query.setHighlightSimplePre("");
- query.setHighlightSimplePost("");
-
- ResultModel resultModel = dao.queryProduct(query);
- resultModel.setCurPage(curPage);
- return resultModel;
- }
-
- }
5.5.4 Controller
5.5.4.1 代码
- @Controller
- public class ProductController {
-
- @Autowired
- private ProductService service;
-
- @RequestMapping("/list")
- public String queryProduct(String queryString, String catalog_name,
- String price, String sort, Integer page, Model model)
- throws Exception {
-
- ResultModel resultModel = service.queryProduct(queryString, catalog_name,
- price, sort, page);
- model.addAttribute("result", resultModel);
- model.addAttribute("queryString", queryString);
- model.addAttribute("caltalog_name", catalog_name);
- model.addAttribute("price", price);
- model.addAttribute("sort", sort);
- model.addAttribute("page", page);
-
- return "product_list";
- }
- }
5.5.4.2 配置
5.5.4.2.1Web.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"
- id="WebApp_ID" version="2.5">
- <display-name>jd0723display-name>
-
- <servlet>
- <servlet-name>springmvcservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
- servlet>
- <servlet-mapping>
- <servlet-name>springmvcservlet-name>
- <url-pattern>*.actionurl-pattern>
- servlet-mapping>
- <filter>
- <filter-name>Character Encodingfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>Character Encodingfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
- web-app>
5.5.4.2.2Springmvc.xml
在config包下,创建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:mvc="http://www.springframework.org/schema/mvc"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.1.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
-
- <context:component-scan base-package="cn.itcast" />
-
- <mvc:annotation-driven />
-
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
- <property name="prefix" value="/WEB-INF/jsp/">property>
-
- <property name="suffix" value=".jsp">property>
- bean>
- <bean class="org.apache.solr.client.solrj.impl.HttpSolrServer">
- <constructor-arg value="http://localhost:8080/solr/">constructor-arg>
- bean>
-
- beans>
5.5.5 启动Tomcat
访问:http://localhost:8180/jd0723/list.action