业务:
1.业务单管理_业务单的快速录入和修改
2.业务单管理_业务单的索引(lucene的使用)
技术点:
1.datarid行编辑(基于ajax)
2.mybatis拦截器实现分页(工作单分页查询)
3.lucene的原理和使用(工作单查询)
4.jboss服务器的使用
01:【datagrid行编辑效果使用】
02:【工作单快速录入和修改】
新增一行
var editIndex ;
function doAdd(){
if(editIndex != undefined){ // 存在正在编辑行
$("#grid").datagrid('endEdit',editIndex); // 结束编辑
}
if(editIndex==undefined){ // 不存在编辑行
$("#grid").datagrid('insertRow',{
index : 0,
row : {}// 空行
});
$("#grid").datagrid('beginEdit',0);
editIndex = 0;
}
}
保存
function doSave(){
$("#grid").datagrid('endEdit',editIndex );
}
保存后,触发事件,将数据以ajax方式提交到sever
onAfterEdit : function(rowIndex, rowData, changes){
// 通过ajax 将当前编辑行数据 发送到服务器,执行insert 操作
$.post("${pageContext.request.contextPath}/workordermanage_save.do", rowData, function(data){
});
// 将当前正在编辑行 重置
editIndex = undefined;
}
使用工作单对象接收参数
public class WorkOrderManage {
private String id; // 编号
private String arrivecity; // 到达城市
private String product; // 货物
private BigDecimal num; // 数量
private Object weight; // 重量
private String floadreqr; // 配置要求 (无、禁航,禁铁路)
}
public void saveWorkOrderManage(WorkOrderManage workOrderManage) {
// saveOrUpdate 效果
// 判断工作单 id 是否存在,如果存在,执行update, 不存在,执行 save
WorkOrderManage persistObject = workOrderManageDAO.findById(workOrderManage.getId());
if (persistObject == null) {
// 不存在
workOrderManageDAO.insert(workOrderManage);
} else {
// 存在
workOrderManageDAO.update(workOrderManage);
}
}
配置 WorkOrderManageMapper.xml
Controller返回json结果
@RequestMapping("/workordermanage_save.do")
@ResponseBody
public Object save(WorkOrderManage workOrderManage) {
Map<String, Object> result = new HashMap<String, Object>();
try {
// 调用业务层 执行保存
workOrderManageService.saveWorkOrderManage(workOrderManage);
result.put("success", true);
result.put("msg", "工作单保存成功");
} catch (Exception e) {
result.put("success", false);
result.put("msg", "工作单保存失败,异常:" + e.getMessage());
}
return result;
}
03:【使用MyBatis拦截器实现动态物理分页】
原理图
步骤一: 页面datagrid的url
$('#grid').datagrid( {
url : "${pageContext.request.contextPath}/workordermanage_pageQuery.do",
步骤二: 编写服务器
在BaseDAO 添加 queryByPage方法
// 使用拦截器的分页
public List<T> queryByPage(PaginationInfo<T> paginationInfo);
步骤三: 配置WorkOrderManageMapper.xml
<!-- 查询工作单信息 (分页)-->
<select id="queryByPage" parameterType="cn.itcast.bos.page.PaginationInfo" resultMap="WorkOrderManageResultMap">
select <include refid="Base_Column_List"/> from qp_workordermanage
</select>
步骤四: 为MyBatis 配置拦截器
<!-- 配置mybatis 拦截器 -->
<plugins>
<plugin interceptor="cn.itcast.bos.page.PageInterceptor"></plugin>
</plugins>
每次执行一条SQL 语句,intercept 方法执行一次
步骤五: 不能让拦截器 对每条SQL都操作
只想拦截指定SQL (DAO 方法)
<!-- 配置MyBatis属性 -->
<properties>
<property name="dialect" value="oracle" /> <!-- 方言 -->
<property name="pageSqlId" value=".*Page$" /> <!-- 拦截哪种SQL:以Page结尾SQL -->
</properties>
步骤六:在拦截器 为SQL拼接分页参数,完成分页查询
代码参考程序
public Object intercept(Invocation invocation) throws Throwable {
// 获得拦截 目标对象
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
MetaObject metaStatementHandler = MetaObject.forObject(statementHandler, new DefaultObjectFactory(), new DefaultObjectWrapperFactory());
MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");
// 获取 sqlId
String sqlId = mappedStatement.getId();// 对应mapper.xml <select> id
// 获取sqlMapConfig 配置属性
Configuration configuration = (Configuration) metaStatementHandler.getValue("delegate.configuration");
String pageSqlId = configuration.getVariables().getProperty("pageSqlId"); // 对应 sqlMapConfig property
if (sqlId.matches(pageSqlId)) {
// 匹配拦截规则 ,执行拦截扩展SQL
System.out.println("mybatis 拦截器 intercept ==============================");
// 获取原来SQL
BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");
System.out.println("原来sql:" + boundSql.getSql());
String sql = boundSql.getSql();
// 获得DAO 方法参数
// 分页参数作为参数对象parameterObject的一个属性
PaginationInfo page = (PaginationInfo) metaStatementHandler.getValue("delegate.boundSql.parameterObject");
// 获取sqlMapConfig 方言
String dialect = configuration.getVariables().getProperty("dialect");
if (dialect.equals("oracle")) {
// oracle
// 重写sql
String pageSql = buildPageSqlForOracle(sql, page).toString();
metaStatementHandler.setValue("delegate.boundSql.sql", pageSql);
// 采用物理分页后,就不需要mybatis的内存分页了,所以重置下面的两个参数
metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET);
metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT);
} else if (dialect.equals("mysql")) {
// mysql
}
// 执行count(*)的sql语句
Connection connection = (Connection) invocation.getArgs()[0];
// 重设分页参数里的总页数等
setPageParameter(sql, connection, mappedStatement, boundSql, page);
}
return invocation.proceed();
}
步骤七: 在拦截器,再执行一条查询count(*) sql
// 执行count(*)的sql语句
Connection connection = (Connection) invocation.getArgs()[0];
// 重设分页参数里的总页数等
setPageParameter(sql, connection, mappedStatement, boundSql, page);
04:【使用lucene建立索引】
lucene官网:
http://lucene.apache.org/
1.为什么要使用lucene?
当进行like模糊查询时,查询效率低。会一条条的检索数据库记录。当数据量较大时,其效率是十分低的。因此lucucene横空出世。
2.lucene的原理?
①lucene会对文本目标内容进行分词,并建立索引库。索引库中保存了词条和其对应在数据库中的记录的主键id。
②当进行检索时,先查询索引库。在索引库中找到对应的词条,获取对应的数据库中的记录的主键id。
③最后通过上面获取的主键id去检索数据记录。其效率大大提高。
3.lucene的应用场景?
lucene在互联网搜索用的较多,常见的有搜索引擎、贴吧论坛的站内搜索等。
4.常用的分词器?
5.开发lucene的步骤
导入lucene核心jar包和IK分词器jar包
使用maven导入lucene-core.jar包。
因为maven仓库中不存在IK分词器jar包,所以需要先手动将其导入到仓库中,再使用坐标进行导入。
参考博客:
点击打开链接
IK分词器官网:
点击打开链接
现在用一个demo来说明lucene的使用。
建立lucene索引Demo
// 建立索引 IndexWriter 对象
@Test
public void demo1() throws CorruptIndexException, LockObtainFailedException, IOException {
// 1、 先获得需要建立索引 目标数据文本信息
String company = "阿里巴巴";
String info = "阿里巴巴集团由本为英语教师的中国互联网先锋马云于1999年带领其他17人在杭州创立,他希望将互联网发展成为普及使用、安全可靠的工具,让大众受惠";
// 2、 将文本信息,转换为 Lucene提供 Document对象
Document document = new Document();
document.add(new Field("company", company, Store.YES, Index.NO));// 一个字段就是field
document.add(new Field("info", info, Store.NO, Index.ANALYZED));
// 3、 建立索引
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_31, new IKAnalyzer());//使用IK分词器
IndexWriter indexWriter = new IndexWriter(FSDirectory.open(new File("d:/index")), indexWriterConfig);
indexWriter.addDocument(document);
indexWriter.close();
}
05:【索引存储原理、结合lucene索引库搜索】
使用Luke工具
luke官网:
点击打开链接
luke是一个可以直接执行的查看索引库信息的工具。
运行方法:java -jar 路径/luke.jar
使用luke打开索引所在的路径,就可以看到索引信息了。
Index.ANALYZED 分词索引,被分词索引字段 用来搜索 (搜索条件)
Store.YES 进行存储, 通过索引搜索到结果 (搜索结果 )
进行lucene检索demo
// 查找索引 IndexSearcher 对象
@Test
public void demo2() throws CorruptIndexException, IOException {
// 1、 创建Lucene Query对象
Query query = new WildcardQuery(new Term("info", "*马*"));//WildcardQuery:模糊查询。
// 2、 使用IndexSearcher 进行搜索
IndexSearcher indexSearcher = new IndexSearcher(FSDirectory.open(new File("d:/index")));//索引所在的位置
TopDocs topDocs = indexSearcher.search(query, 100); // 搜索结果前100条
System.out.println("实际查询结果:" + topDocs.totalHits);
// 3. 具体查询结果
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int docID = scoreDoc.doc; // 获得索引库中文档编号
Document document = indexSearcher.doc(docID);
// 获得文档数据
System.out.println("company:" + document.get("company"));
System.out.println("info:" + document.get("info"));
}
}
06:【对工作单数据建立lucene索引库】
保持数据库和索引库的同步。
要改动 WorkOrderManageServiceImpl 。在save 工作单时, 建立索引库。在update 工作单时,更新索引库。
@Repository
public class WorkOrderManageIndexDAO {
/**
* 建立工作单索引
*
* @param workOrderManage
*/
public void createWorkOrderManageIndex(WorkOrderManage workOrderManage) {
// 先将数据 转换Document 对象
Document document = new Document();
document.add(new Field("id", workOrderManage.getId(), Store.YES, Index.NOT_ANALYZED));
document.add(new Field("arrivecity", workOrderManage.getArrivecity(), Store.NO, Index.ANALYZED));
document.add(new Field("product", workOrderManage.getProduct(), Store.NO, Index.ANALYZED));
// 创建索引
IndexWriter indexWriter = LuceneUtils.getIndexWriter();
try {
indexWriter.addDocument(document);
indexWriter.commit();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("索引建立失败!");
}
}
/**
* 修改工作单索引
*
* @param workOrderManage
*/
public void updateWorkOrderManageIndex(WorkOrderManage workOrderManage) {
// 先将数据 转换Document 对象
Document document = new Document();
document.add(new Field("id", workOrderManage.getId(), Store.YES, Index.NOT_ANALYZED));
document.add(new Field("arrivecity", workOrderManage.getArrivecity(), Store.NO, Index.ANALYZED));
document.add(new Field("product", workOrderManage.getProduct(), Store.NO, Index.ANALYZED));
// 更新索引
IndexWriter indexWriter = LuceneUtils.getIndexWriter();
try {
Term term = new Term("id", workOrderManage.getId());// 通过id词条更新document
indexWriter.updateDocument(term, document);
indexWriter.commit();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("索引建立失败!");
}
}
}
07:【结合lucene索引库完成工作单搜索功能】
08:【JBOSS配置使用】
JavaEE主要应用服务器
Tomcat: Apache公司,免费Servlet、JSP容器 , 主要支持javaweb规范和几个JavaEE技术
JBOSS: JBOSS公司 免费JavaEE 应用服务器 ,全面支持 JavaEE规范
(Hibernate、 JBPM )
WebLogic: Oracle公司 收费JavaEE应用服务器
WebSphere: IBM公司 收费JavaEE 应用服务器
JBOSS有两种版本。一种eap 版本, 一种 as 版本,使用 AS(Application Server )就可以。
JBOSS官网:
http://jbossas.jboss.org/
配置JBOSS
1.配置JBOSS_HOME(非必要)
启动程序 bin\standalone.bat
发布项目 standalone\deployments
配置服务器 standalone\configuration\standalone.xml
2.修改端口
JBOSS的默认端口为8080,与oracle的端口冲突,要进行更改。这里我们修改为9000.
<socket-binding name="http" port="9000"/>
3.为JBOSS配置admin账户
运行bin目录下的add-user.bat。前面都直接跳过,到输入用户名和密码的地方,建立用户名和密码。
这里我们新建jboss用户,并将密码设置为123.
将项目发布到JBOSS
没有直接发布到JBOSS的插件。但是可以进行打包,我们只需打成war包,再将war包放到JBOSS服务器下,即可访问。
首先,使用maven的package命令,对工程打包。
因为打包后的项目会带有一个0.0.1-SNAPSHOT后缀。所以可以在pom.xml中
配置finalName,即程序最终发布名。
刷新一下工程,看到war已经打好了。将其拷贝出来放到%JBOSS_HOME%\standalone\deployments目录下。
重启服务器,在浏览器中就可以使用以下路径访问工程了。
其它命令:
maven:clean
注意:每次运行maven命令后要刷新一下项目,不然看不到即时效果。在eclipse中使用jboss
由于eclipse只支持到JBOSS5.0版本,不支持更高的。如果要使用更高版本的JBOSS,则可以使用JBoss Tools工具。
JBoss Tools官方网站:
点击打开链接
JBoss Tools官方文档:
点击打开链接
注意: 不同版本的JBoss Tools对eclipse的版本也有要求。
分享到:
相关推荐
在这个名为"Logistics-Management-System-master"的项目中,开发者使用SSH框架实现了一个完整的物流管理系统。下面将详细探讨这个系统的关键组件和功能。 1. **Struts框架**: Struts是MVC(Model-View-Controller...
(完整word版)供应链物流管理(supply-chain-logistics-management)鲍尔索克斯-课后习题答案1
【标题】"caokaifan-logistics-master.zip" 提供的是一份名为“物流管理系统”的源代码库,可能是一个开源项目或个人作品。这个压缩包包含的主要是与物流管理相关的软件开发资源,主要编程语言可能是Java和Python。 ...
文件“VB logistics management system.doc”可能是系统的设计文档或使用手册,详细阐述了系统的架构设计、功能实现以及操作指南,对于理解和使用该系统具有重要参考价值。 总的来说,VB物流管理系统充分利用了...
yunshun-物流-logistics-云顺-2024-3-12
该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理...
端到端供应链可见性的经济有效解决方案 在运输过程中或在仓库中休息时改善对托盘和包裹的跟踪。英特尔的货运管理解决方案能够经济高效地监控货运,并在其位置或状况发生意外变化时提供反馈。这些工业解决方案可提高...
《物流管理系统的ASP实现》 在信息技术飞速发展的今天,物流管理系统已经成为企业高效运营的关键工具。本篇将探讨一个基于ASP(Active Server Pages)技术构建的物流管理系统,它被誉为“s093砖石级的价值10万多元...
2122-8535-msc-logistics-and-supply-chain-analytics (1).odt
Intelligent_Logistics-master.zip
第三方物流管理 POWER BY ODOO
【标题】"itcast-logistics-parent.zip"是一个压缩包文件,根据其命名,可以推测它可能包含的是一个物流相关的项目,而"itcast"通常指的是传智播客,这是一家知名的IT教育机构。这个项目的父级目录名为"itcast-...
《深入理解DDD领域驱动设计——以“logistics-service”为例》 在软件开发领域,领域驱动设计(Domain-Driven Design,简称DDD)是一种强大的方法论,它强调将业务逻辑和软件设计紧密结合,以提高软件系统的可维护...
openerp-logistics-book.complete.pdf
数据库课程设计_logistics-system
毕业设计-基于Web的物流订单系统的设计与实现_logistics-order-manage
logistics-front(物流管理系统前端) 物流管理系统前端项目,基于Layui-2.3.0,缩小项目传送门: : 个人博客地址: ://www.ltysyn.cn/?p 173 csdn地址: : 欢迎大家star或fork
标题中的"LDA-QDA-Logistics-Classifiers-master"暗示了这是一个关于使用Python实现逻辑回归(Logistic Regression)、线性判别分析(Linear Discriminant Analysis, LDA)和二次判别分析(Quadratic Discriminant ...
从提供的信息来看,"logistics-back.rar"可能是一个包含源代码、数据库配置、服务器设置等相关资料的压缩文件。以下是关于构建和设计国际物流系统后端的一些关键知识点: 1. **系统架构**:国际物流系统的后端通常...