logistics-8-workbill management

来源:互联网 发布:c语言编程图书管理系统 编辑:程序博客网 时间:2024/05/17 06:06
业务:
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, 不存在,执行 saveWorkOrderManage persistObject = workOrderManageDAO.findById(workOrderManage.getId());if (persistObject == null) {// 不存在workOrderManageDAO.insert(workOrderManage);} else {// 存在workOrderManageDAO.update(workOrderManage);}}

配置 WorkOrderManageMapper.xml 

Controller返回json结果
@RequestMapping("/workordermanage_save.do")@ResponseBodypublic 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");// 获取 sqlIdString sqlId = mappedStatement.getId();// 对应mapper.xml <select> id// 获取sqlMapConfig 配置属性Configuration configuration = (Configuration) metaStatementHandler.getValue("delegate.configuration");String pageSqlId = configuration.getVariables().getProperty("pageSqlId"); // 对应 sqlMapConfig propertyif (sqlId.matches(pageSqlId)) {// 匹配拦截规则 ,执行拦截扩展SQLSystem.out.println("mybatis 拦截器 intercept ==============================");// 获取原来SQLBoundSql 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// 重写sqlString 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 对象@Testpublic 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));// 一个字段就是fielddocument.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 对象@Testpublic 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 工作单时,更新索引库。
@Repositorypublic 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词条更新documentindexWriter.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的版本也有要求。

0 0