logistics-8-workbill management
来源:互联网 发布:c语言编程图书管理系统 编辑:程序博客网 时间:2024/05/17 06:06
业务:
1.业务单管理_业务单的快速录入和修改
2.业务单管理_业务单的索引(lucene的使用)
技术点:
1.datarid行编辑(基于ajax)
2.mybatis拦截器实现分页(工作单分页查询)
3.lucene的原理和使用(工作单查询)
4.jboss服务器的使用
使用工作单对象接收参数
配置 WorkOrderManageMapper.xml
Controller返回json结果
步骤一: 页面datagrid的url
在BaseDAO 添加 queryByPage方法
步骤五: 不能让拦截器 对每条SQL都操作
只想拦截指定SQL (DAO 方法)
步骤六:在拦截器 为SQL拼接分页参数,完成分页查询
代码参考程序
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的使用。
luke是一个可以直接执行的查看索引库信息的工具。
运行方法:java -jar 路径/luke.jar
使用luke打开索引所在的路径,就可以看到索引信息了。
Index.ANALYZED 分词索引,被分词索引字段 用来搜索 (搜索条件)
Store.YES 进行存储, 通过索引搜索到结果 (搜索结果 )
要改动 WorkOrderManageServiceImpl 。在save 工作单时, 建立索引库。在update 工作单时,更新索引库。
JBOSS: JBOSS公司 免费JavaEE 应用服务器 ,全面支持 JavaEE规范
(Hibernate、 JBPM )
WebLogic: Oracle公司 收费JavaEE应用服务器
WebSphere: IBM公司 收费JavaEE 应用服务器
JBOSS有两种版本。一种eap 版本, 一种 as 版本,使用 AS(Application Server )就可以。
JBOSS官网:http://jbossas.jboss.org/
启动程序 bin\standalone.bat
发布项目 standalone\deployments
配置服务器 standalone\configuration\standalone.xml
2.修改端口
JBOSS的默认端口为8080,与oracle的端口冲突,要进行更改。这里我们修改为9000.
运行bin目录下的add-user.bat。前面都直接跳过,到输入用户名和密码的地方,建立用户名和密码。
这里我们新建jboss用户,并将密码设置为123.
首先,使用maven的package命令,对工程打包。
因为打包后的项目会带有一个0.0.1-SNAPSHOT后缀。所以可以在pom.xml中配置finalName,即程序最终发布名。
刷新一下工程,看到war已经打好了。将其拷贝出来放到%JBOSS_HOME%\standalone\deployments目录下。
重启服务器,在浏览器中就可以使用以下路径访问工程了。
其它命令:
maven:clean
注意:每次运行maven命令后要刷新一下项目,不然看不到即时效果。
JBoss Tools官方网站:点击打开链接
JBoss Tools官方文档:点击打开链接
注意: 不同版本的JBoss Tools对eclipse的版本也有要求。
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
- logistics-8-workbill management
- logistics-3-staff management
- logistics-4-region management
- logistics-5-subarea management
- logistics-6-decidedZone management
- logistics-9-system privilege management(Apache Shiro)
- 使用IMS搭建LMS系统(Logistics Management System 物流管理信息系统)
- 第一课:Logistics, iOS 8 Overview
- Logistics Rrgression(Logistics回归)
- Logistics推导
- Logistics-->SVM
- Crowdsourcing Logistics
- Logistics回归
- logistics笔记
- ILR(Intelligent Logistics Route)
- LA4080 Warfare And Logistics
- logistics-7-business acceptance
- logistics-10-summary
- 1-byte array(byte[], boolean[])图片导致的内存过大
- logistics-6-decidedZone management
- hive第一篇----简介和使用客户端
- logistics-7-business acceptance
- 这次的教训是深刻的--关于使用GetFiles()删除文件的后果!
- logistics-8-workbill management
- MySQL学习笔记_2_MySQL创建数据表(上)
- MySQL 错误码
- logistics-9-system privilege management(Apache Shiro)
- 苹果推送通知服务中的iOS 教程
- 正式开放 食品、 食物API接口
- [UVA 10129] Play on Words (图的连通性 + 欧拉回路)
- LInux 锂电池驱动分析
- Reason: image not found 解决方案