`
javandroid
  • 浏览: 25573 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

logistics-8-workbill management

 
阅读更多
业务:
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的版本也有要求。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics