.net core 添加数据保存后 显示不了数据

点击幻灯片管理

把当前id传到另外一个显示数据界面

获取到关联的信息
在这个幻灯片管理 页面添加数据 保存后跳转 到显示数据界面
这时候没有就没有点击幻灯片管理时传过来的 id 显示不了数据 有什么方法
调试 id 为null 所以没数据

图片说明

图片说明

主 副表两表 第二个页面显示是第一个页面当前id 关联的信息

1个回答

用viewbag.Id吧Id存起来啊

qq_39815900
沫琉璃 要跳回去就把viewbag.Id的数据拿出来当参数传回去啊
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
请大佬们看看我上传图片到本地项目然后数据库保存路劲为null是那部分出错了?
接收图片的jsp前端页面 ``` <form method="post" action="PicUpServlet" enctype="multipart/form-data"> <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;"> <legend>添加文章</legend> </fieldset> <div class="layui-form-item layui-form-text" > <div class="layui-input-block" style="margin-left: 0px;"> <textarea placeholder="请输入内容" class="layui-textarea"></textarea> </div> </div> <!-- <input type="text" name="content" /><br/> --> <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;" > <legend>添加图片</legend> </fieldset> <div style="margin-left: 8px;"> <input type="file" name="uploadFile"/> </div> <br/><br/> <div style="margin-left: 8px;"> <input type="submit" value="上传" /> </div> </form> ``` 文件保存 ``` package com.gugu.servlet; import java.io.File; import java.io.IOException; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.gugu.dao.WisUploadDao; import com.gugu.pojo.GgNote; import com.gugu.util.Upload; public class PicUpServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String UPLOAD_DIRECTORY = "C:\\MyBlog-master\\WebContent\\images"; public PicUpServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String path = UPLOAD_DIRECTORY+"//images//"+File.separator ; Map<String, String> map = Upload.upload(request, 1024 * 1024 * 10, path); String newFileName ="images"+File.separator+ map.get("newFileName"); GgNote note = new GgNote(); note.setNoteContent(map.get("content")); note.setNotePhoto(newFileName); System.out.println(newFileName); System.out.println(map.get("content")); WisUploadDao add = new WisUploadDao(); add.addwis(note); response.sendRedirect("page/whisper/manage.jsp"); } } ``` 判断文字还是图片 ``` package com.gugu.util; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.oreilly.servlet.multipart.FilePart; import com.oreilly.servlet.multipart.MultipartParser; import com.oreilly.servlet.multipart.ParamPart; import com.oreilly.servlet.multipart.Part; public class Upload { public static Map<String, String> upload(HttpServletRequest request,int maxSize, String path) { //以map形式保存数据 key对应保存的是获取界面上的name名称 value保存的是获取界面上的name对应的值 Map<String, String> map = new HashMap<String, String>(); Part part = null; try { MultipartParser mrequest = new MultipartParser(request, maxSize); mrequest.setEncoding("utf-8"); //遍历所有的part组 while ((part = mrequest.readNextPart()) != null) { if (part.isFile()) { //判断是否是文件 FilePart filepart = (FilePart) part;//转化成文件组 String fileName = filepart.getFileName();//得到文件名 if (fileName != null && fileName.length() > 0) { // 取得扩展名 String fileExtName = fileName.substring( fileName.lastIndexOf(".") + 1).toLowerCase(); // 只上传图片 //判断图片上传的格式是否符合 后缀名是否有效 if (fileExtName.equalsIgnoreCase("jpeg") || fileExtName.equalsIgnoreCase("png") || fileExtName.equalsIgnoreCase("jpg") || fileExtName.equalsIgnoreCase("gif") || fileExtName.equalsIgnoreCase("ico") || fileExtName.equalsIgnoreCase("bmp") || fileExtName.equalsIgnoreCase("flv") || fileExtName.equalsIgnoreCase("mp4") || fileExtName.equalsIgnoreCase("mp3")) { /*String newFileName = new Date().getTime() + "."+ fileExtName;//重新改文件名 文件名+扩展名 */ String newFileName =new Date().getTime() +fileName;//不改图片名字 String newPath = path + "/" + newFileName; //文件处理文件上传的路径 File newFile = new File(newPath); filepart.writeTo(newFile); //将文件真正写入到对应的文件夹中 //filepart.getName() 得到 request 要接收的参数的名字 map.put("newFileName", newFileName); map.put(filepart.getName(), newFileName);//把文件信息保存到map中 map.put("newFile", newFile.toString()); } else { map.put("geshi", "geshi"); continue; }// 说明上传的不是图片 } else { map.put("yes","yes"); continue; // 说明没有选择上传图片 } } else if (part.isParam()) { //判断是否是参数 ParamPart paramPart = (ParamPart) part; map.put(paramPart.getName(), paramPart.getStringValue()); } } } catch (IOException e) { e.printStackTrace(); } return map; } } ``` 上传到数据库的文字内容为null 图片保存路劲也为null请问是那部分出错了 控制台报错 ``` java.io.FileNotFoundException: C:\Users\12874\Desktop\毕业设计\MyBlog-master\WebContent\images\images\1572883296157tony_tony_chopper-006.jpg (系统找不到指定的路径。) at java.io.FileOutputStream.open0(Native Method) at java.io.FileOutputStream.open(Unknown Source) at java.io.FileOutputStream.<init>(Unknown Source) at java.io.FileOutputStream.<init>(Unknown Source) at com.oreilly.servlet.multipart.FilePart.writeTo(FilePart.java:166) at com.gugu.util.Upload.upload(Upload.java:50) at com.gugu.servlet.PicUpServlet.doPost(PicUpServlet.java:40) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) images\null null ```
Spring 配置weblogic中的JNDI数据源,发现部分模块数据查询失败
配置了weblogic的数据源(经测试可用),在项目applicationContext.xml文件中做了如下修改: ``<bean id="defaultDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="JNDI/Szzjj"></property> </bean> `` 启动项目后发现,有部分模块easyUI datagrid列表展示不出数据,但是可以保存添加数据,后台报错为: ``` org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [99999]; error code [17104]; SQL statement to execute cannot be empty or null; nested exception is java.sql.SQLException: SQL statement to execute cannot be empty or null at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:711) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:761) at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192) at cn.jasgroup.jasframework.dataaccess3.core.BaseNamedParameterJdbcTemplate.queryForList(BaseNamedParameterJdbcTemplate.java:284) at cn.jasgroup.jasframework.dataaccess.springhelper.JdbcDaoHelper.getPage(JdbcDaoHelper.java:533) at cn.jasgroup.jasframework.dataaccess.base.BaseJdbcDao.getPage(BaseJdbcDao.java:282) at cn.jasgroup.jasframework.engine.service.AbstractCommonDataService.getPage(AbstractCommonDataService.java:197) at cn.jasgroup.jasframework.engine.service.AbstractCommonDataService$$FastClassBySpringCGLIB$$6c27ab1d.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) at cn.jasgroup.entmanagement.gasservicepoint.service.GasServicePointService$$EnhancerBySpringCGLIB$$6aae7027.getPage(<generated>) at cn.jasgroup.entmanagement.gasservicepoint.controller.GasServicePointController.getPage(GasServicePointController.java:245) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at cn.jasgroup.jasframework.security.base.SetCacheFilter.doFilter(SetCacheFilter.java:42) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at cn.jasgroup.jasframework.dataaccess.filter.DataSourceFilter.doFilter(DataSourceFilter.java:46) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3706) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3672) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:328) at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71) at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2443) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2291) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2269) at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1705) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1665) at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:272) at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:352) at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:337) at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:57) at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:652) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:420) at weblogic.work.ExecuteThread.run(ExecuteThread.java:360) Caused by: java.sql.SQLException: SQL statement to execute cannot be empty or null at oracle.jdbc.driver.PhysicalConnection.prepareStatementInternal(PhysicalConnection.java:1642) at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1620) at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1547) at weblogic.jdbc.common.internal.ConnectionEnv.makeStatement(ConnectionEnv.java:2206) at weblogic.jdbc.common.internal.ConnectionEnv.getCachedStatement(ConnectionEnv.java:1902) at weblogic.jdbc.common.internal.ConnectionEnv.getCachedStatement(ConnectionEnv.java:1816) at weblogic.jdbc.common.internal.ConnectionEnv.getCachedStatement(ConnectionEnv.java:1809) at weblogic.jdbc.wrapper.Connection.prepareStatement(Connection.java:658) at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory .java:238) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:627) ... 71 more ``` ,各位大神有知道什么原因的吗?是缺少什么东西吗?用Tomcat的jndi测试没有问题,可以正常展示。
删除实现不了,数据库已经连上了
at com.wyk.ConnDB.executeUpdata(ConnDB.java:67) at org.apache.jsp.goods_005fdelete_jsp._jspService(goods_005fdelete_jsp.java:81) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) package com.wyk; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class ConnDB { public Connection conn = null; public Statement stmt = null; public ResultSet rs = null; private static Statement st = null; //设置Statement类的对象 private static String propFileName = "/com/connDB.properties"; //指定资源文件保存的位置 private static Properties prop = new Properties(); private static String dbClassName ="com.mysql.jdbc.Driver"; private static String dbUrl = "jdbc:mysql://127.0.0.1:3306/db_wuliu?user=root&password=mysql&useUnicode=true"; public ConnDB(){ try { InputStream in=getClass().getResourceAsStream(propFileName); prop.load(in); //通过输入流对象加载Properties文件 dbClassName = prop.getProperty("DB_CLASS_NAME"); //获取数据库驱动 dbUrl = prop.getProperty("DB_URL", "jdbc:mysql://127.0.0.1:3306/db_wuliu?user=root&password=mysql&useUnicode=true"); } catch (Exception e) { e.printStackTrace(); //输出异常信息 } } public static Connection getConnection() { Connection conn = null; try { Class.forName(dbClassName).newInstance(); conn = DriverManager.getConnection(dbUrl); } catch (Exception ee) { ee.printStackTrace(); } if (conn == null) { System.err.println( "警告: DbConnectionManager.getConnection() 获得数据库链接失败.\r\n\r\n链接类型:" + dbClassName + "\r\n链接位置:" + dbUrl); } return conn; } /* * 功能:执行查询语句 */ public ResultSet executeQuery(String sql) { try { conn = getConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(sql); } catch (SQLException ex) { System.err.println(ex.getMessage()); } return rs; } /* * 功能:执行更新操作 */ public boolean executeUpdata(String sql) { try { st = conn.createStatement(); //创建声明对象连接 ((ConnDB) st).executeUpdata(sql); //执行添加、修改、删除操作 return true; //如果执行成功则返回true } catch (Exception e) { e.printStackTrace(); return false; //如果执行成功则返回false }} /* * 功能:关闭数据库的连接 */ public void close() { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(System.err); } } }
远程连接redis连接池总是报错
springboot连接redis 项目启动 服务器上redis是开着的 也能连上 redis.conf中绑定本地id也删除了 就是用这个连接池的时候报错 控制台报如下错误: ``` org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:204) at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:348) at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:129) at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:92) at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:79) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:194) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:169) at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:91) at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:169) at com.how2java.test.TestRedisOne.testRedisOne(TestRedisOne.java:82) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:53) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16) at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:194) ... 38 more Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out at redis.clients.jedis.Connection.connect(Connection.java:207) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93) at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767) at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:888) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:432) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) at redis.clients.util.Pool.getResource(Pool.java:49) ... 41 more Caused by: java.net.SocketTimeoutException: connect timed out at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at redis.clients.jedis.Connection.connect(Connection.java:184) ... 48 more ``` ``` package com.how2java.springboot.web; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.how2java.redis.RedisClient; import com.how2java.springboot.pojo.JsonData; import com.how2java.springboot.pojo.UserPojo; import com.how2java.utils.JsonUtils; @RestController @RequestMapping("/api/v1/redis") public class RedisTestController { //得到redis封装类 @Autowired private RedisClient redis; //添加字符串 @GetMapping(value="add") public Object add(){ redis.set("username", "xddddddd"); return JsonData.buildSuccess(); } //通过key值得到value字符串 @GetMapping(value="get") public Object get(){ String value = redis.get("username"); return JsonData.buildSuccess(value); } //将对象通过工具类转成String类型,存入redis中 @GetMapping(value="save_user") public Object saveUser(){ UserPojo user = new UserPojo(1, "abc", "11", new Date()); String userStr = JsonUtils.obj2String(user); boolean flag = redis.set("base:user:11", userStr); return JsonData.buildSuccess(flag); } //通过key值得到value值,让后将value转为对象 @GetMapping(value="find_user") public Object findUser(){ String userStr = redis.get("base:user:11"); UserPojo user = JsonUtils.string2Obj(userStr, UserPojo.class); return JsonData.buildSuccess(user); } } ``` application.propertites ``` ##REDIS (RedisProperties) spring.redis.host=39.105.35.139 spring.redis.port=6397 spring.redis.pool.max-idle=200 spring.redis.pool.min-idle=200 spring.redis.pool.max-active=2000 spring.redis.pool.max-wait=1000 spring.redis.timeout=3000 spring.redis.database=0 spring.redis.password= ``` ``` package com.how2java.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; /** * 功能描述:redis工具类 * 对于redisTpl.opsForValue().set(key, value)进行了一次封装,不然每次都要这样保存值 * 而封装后只需:new RedisClient().set(key,value); */ @Component public class RedisClient { @Autowired private StringRedisTemplate redisTpl; //jdbcTemplate // 功能描述:设置key-value到redis中 public boolean set(String key ,String value){ try{ redisTpl.opsForValue().set(key, value); return true; }catch(Exception e){ e.printStackTrace(); return false; } } // 功能描述:通过key获取缓存里面的值 public String get(String key){ return redisTpl.opsForValue().get(key); } } ``` ``` package com.how2java.utils; import java.io.IOException; import org.springframework.util.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; /** * 字符串转对象,对象转字符串的工具类 * 因为StringRedisTemplate的opsForValue()方法需要key,value都需要String类型,所以当value值存入对象的时候 * 先转成字符串后存入。 */ public class JsonUtils { private static ObjectMapper objectMapper = new ObjectMapper(); //对象转字符串 public static <T> String obj2String(T obj){ if (obj == null){ return null; } try { return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj); } catch (Exception e) { e.printStackTrace(); return null; } } //字符串转对象 public static <T> T string2Obj(String str,Class<T> clazz){ if (StringUtils.isEmpty(str) || clazz == null){ return null; } try { return clazz.equals(String.class)? (T) str :objectMapper.readValue(str,clazz); } catch (IOException e) { e.printStackTrace(); return null; } } } ``` ``` package com.how2java.springboot.pojo; import java.io.Serializable; /** * 这是后端向前端响应的一个包装类 * 一般后端向前端传值会有三个属性 * 1:响应状态 * 2:如果响应成功,把数据放入 * 3: 描述,响应成功描述,或者失败的描述 */ public class JsonData implements Serializable { private static final long serialVersionUID = 1L; private Integer code; // 状态码 0 表示成功,1表示处理中,-1表示失败 private Object data; // 数据 private String msg;// 描述 public JsonData() { } public JsonData(Integer code, Object data, String msg) { this.code = code; this.data = data; this.msg = msg; } // 成功,只返回成功状态码 public static JsonData buildSuccess() { return new JsonData(0, null, null); } // 成功,传入状态码和数据 public static JsonData buildSuccess(Object data) { return new JsonData(0, data, null); } // 失败,传入描述信息 public static JsonData buildError(String msg) { return new JsonData(-1, null, msg); } // 失败,传入描述信息,状态码 public static JsonData buildError(String msg, Integer code) { return new JsonData(code, null, msg); } // 成功,传入数据,及描述信息 public static JsonData buildSuccess(Object data, String msg) { return new JsonData(0, data, msg); } // 成功,传入数据,及状态码 public static JsonData buildSuccess(Object data, int code) { return new JsonData(code, data, null); } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public static long getSerialversionuid() { return serialVersionUID; } @Override public String toString() { return "JsonData [code=" + code + ", data=" + data + ", msg=" + msg + "]"; } //提供get和set方法,和toString方法 } ``` ``` package com.how2java.springboot.pojo; import java.util.Date; public class UserPojo { private int age; private String pwd; private String phone; private Date createTime; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public UserPojo() { super(); } public UserPojo(int age, String pwd, String phone, Date date) { super(); this.age = age; this.pwd = pwd; this.phone = phone; this.createTime = date; } } ```
spring4.0+jdbc+oracle获取自增主键
最近在用spring4.0,用spring的jdbctemplate,从oracle数据库中添加数据,然后获取自增主键,可是出现的问题,可以正常的插入数据但是不能获取到主键值,请大家帮忙看看。我用的oracle驱动是ojdbc6.jar,oracle是11g,下面是我的代码 //保存数据的代码 public int saveProduct(){ KeyHolder kh = new GeneratedKeyHolder(); final String sql = "insert into n_show(id,cname) values(seq_niupai.nextval,?)"; jdbc.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { // TODO Auto-generated method stub PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, "111"); return ps; } }, kh); int key = kh.getKey().intValue(); return key; } 运行后能正常的插入数据 下面是错误,有点长,请大家耐心看看,谢谢!! 8:01:10,470 DEBUG org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator:281 - Unable to translate SQLException with Error code '17090', will now try the fallback translator 18:01:10,470 DEBUG org.springframework.jdbc.support.SQLStateSQLExceptionTranslator:95 - Extracted SQL state class '99' from value '99999' 18:01:10,471 DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver:134 - Resolving exception from handler [public java.lang.String com.lanrui.web.shopadmin.ProductSetController.saveorupdatePro(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap)]: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [99999]; error code [17090]; 不允许的操作; nested exception is java.sql.SQLException: 不允许的操作 18:01:10,473 DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver:134 - Resolving exception from handler [public java.lang.String com.lanrui.web.shopadmin.ProductSetController.saveorupdatePro(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap)]: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [99999]; error code [17090]; 不允许的操作; nested exception is java.sql.SQLException: 不允许的操作 18:01:10,474 DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver:134 - Resolving exception from handler [public java.lang.String com.lanrui.web.shopadmin.ProductSetController.saveorupdatePro(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap)]: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [99999]; error code [17090]; 不允许的操作; nested exception is java.sql.SQLException: 不允许的操作 18:01:10,475 DEBUG org.springframework.web.servlet.DispatcherServlet:969 - Could not complete request org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [99999]; error code [17090]; 不允许的操作; nested exception is java.sql.SQLException: 不允许的操作 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:630) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:913) at com.lanrui.dao.ProductDao.saveProduct(ProductDao.java:107) at com.lanrui.service.ProductService.saveproduct(ProductService.java:58) at com.lanrui.web.shopadmin.ProductSetController.saveorupdatePro(ProductSetController.java:110) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Java WEB 连接数据库的登录界面失败?
使用Eclipse做登陆界面,连接MySQL 8.0,测试过连接数据库应该是成功的,可能是struts配置有问题,新手不知道问题出在哪里,请帮忙看一下代码,我标注几个我可能出问题又不知道怎么改的地方 //login.jsp //此处可能是表单中form的action属性有问题? ``` <%@ page contentType="text/html; charset=gb2312" language="java"%> <html> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <head> <title>图书馆管理系统</title> <link href="CSS/style.css" rel="stylesheet"> <script language="javascript"> function check(form){ if (form.name.value==""){ alert("请输入用户名称");form.name.focus();return false; } if (form.pwd.value==""){ alert("请输入密码");form.pwd.focus();return false; } } </script> </head> <body> <table width="1000" border="0" align="center" cellpadding="0" cellspacing="0" class="tableBorder"> <tr> <td width="1000" height="545" align="center" background="Images/login.png"> <table width="1000" height="345" aligh="center" ></table> <form name="form1" method="post" action="manager.do?action=login"> <table width="400" height="200" align="left"> <tr> <td height="37" style="width: 128px; "></td> <td height="37" width="50"> 用户名</td> <td height="37" width="150"> <input name="name" type="text" class="logininput" id="name" size="27"> </td> </tr> <tr> <td height="37" style="width: 128px; "></td> <td height="37" width="50"> 密码 </td> <td height="37" width="150"> <input name="pwd" type="text" class="logininput" id="pwd" size="27"> </td> </tr> <tr> <td height="37" style="width: 128px; "></td> <td height="37" width="50"></td> <td height="37" width="200"> <input name="Submit" type="submit" class="btn_grey" value="确定" onClick="return check(form1)"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input name="Submit3" type="reset" class="btn_grey" value="重置"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input name="Submit2" type="button" class="btn_grey" value="关闭" onClick="window.close();"> </td> </tr> </table> </form> </td> <tr> <td align="center" height="50" bgcolor="#3A3A3A" class="word_login">CopyRight &copy; 2019版权所有 xx图书馆<br> </td> </tr> </table> </body> </html> ``` //Manager.java ``` package com.action; import org.apache.struts.action.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.actionForm.ManagerForm; import com.dao.ManagerDAO; import javax.servlet.http.HttpSession; public class Manager extends Action { private ManagerDAO managerDAO = null; public Manager() { this.managerDAO = new ManagerDAO(); } public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String action = request.getParameter("action"); // System.out.println("获取的查询字符串:" + action); if (action == null || "".equals(action)) { return mapping.findForward("error"); } else if ("login".equals(action)) { return managerLogin(mapping, form, request, response); } request.setAttribute("error", "操作失败!"); return mapping.findForward("error"); } // 管理员身份验证 public ActionForward managerLogin(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { ManagerForm managerForm = (ManagerForm) form; //将接收到的表单信息强制转换成ActionForm类型 managerForm.setAd_name(managerForm.getAd_name()); managerForm.setAd_pwd(managerForm.getAd_pwd()); int ret = managerDAO.checkManager(managerForm); System.out.print("验证结果ret的值:" + ret); if (ret == 1) { //将登录到系统的管理员名称保存到session HttpSession session = request.getSession(); session.setAttribute("manager", managerForm.getAd_name()); return mapping.findForward("managerLoginok"); } else { request.setAttribute("error", "您输入的管理员名称或密码错误!"); return mapping.findForward("error"); } } } ``` //ManagerForm ``` package com.actionForm; import org.apache.struts.action.ActionForm; public class ManagerForm extends ActionForm { private int ad_id; private String ad_name; private String ad_pwd; public ManagerForm() { } public int getAd_id() { return ad_id; } public void setAd_id(int ad_id) { this.ad_id=ad_id; } public String getAd_name() { return ad_name; } public void setAd_name(String ad_name) { this.ad_name=ad_name; } public String getAd_pwd() { return ad_pwd; } public void setAd_pwd(String ad_pwd) { this.ad_pwd=ad_pwd; } } ``` //ManagerDAO ``` package com.dao; import com.core.ChStr; import com.core.ConnDB; import java.util.*; import com.actionForm.ManagerForm; import java.sql.*; public class ManagerDAO { private ConnDB conn = new ConnDB(); //管理员身份验证 public int checkManager(ManagerForm managerForm) { int flag = 0; ChStr chStr=new ChStr(); String sql = "SELECT * FROM Ad_info where ad_name='" + chStr.filterStr(managerForm.getAd_name()) + "'"; ResultSet rs = conn.executeQuery(sql); try { if (rs.next()) { String pwd = chStr.filterStr(managerForm.getAd_pwd()); //获取输入的密码并过滤输入字符串中的危险字符 if (pwd.equals(rs.getString(3))) { flag = 1; } else { flag = 0; } }else{ flag = 0; } } catch (SQLException ex) { flag = 0; }finally{ conn.close(); } return flag; } } ``` //ConnDB ``` package com.core; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class ConnDB { public Connection conn=null; public Statement stmt=null; public ResultSet rs=null; private static String propFileName="/com/connDB.properties"; private static Properties prop=new Properties(); private static String dbClassName="com.mysql.cj.jdbc.Driver"; private static String dbUrl="jdbc:mysql://223.80.110.29:3306/sys_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL"; private static String dbUserName="root"; private static String dbPassword=""; //加载资源文件 public ConnDB() { try { InputStream in=getClass().getResourceAsStream(propFileName); prop.load(in); dbClassName=prop.getProperty("DB_CLASS_NAME","com.mysql.cj.jdbc.Driver"); dbUrl=prop.getProperty("DB_URL","jdbc:mysql://localhost:3306/db_librarysys?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL"); dbUserName=prop.getProperty("DB_USERNAME"); dbPassword=prop.getProperty("DB_PASSWORD"); } catch(Exception e){ e.printStackTrace(); } } public static Connection getConnection() { Connection conn=null; try { //加载数据库驱动 Class.forName(dbClassName); conn=DriverManager.getConnection(dbUrl,dbUserName,dbPassword); } catch(Exception ee) { ee.printStackTrace(); } if(conn==null) { System.err.println("警告:DbConnectionManager.getConnection()获得数据库链接失败.\r\n\r\n链接类型:"+dbClassName+"\r\n链接位置:"+dbUrl); } return conn; } //执行查询语句 public ResultSet executeQuery(String sql) { try { conn=getConnection(); stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /*ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表 ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。 */ rs=stmt.executeQuery(sql); } catch(SQLException ex){ System.err.println(ex.getMessage()); } return rs; } //执行更新操作 添加修改删除数据 public int executeUpdate(String sql) { int result=0;//更新的行数 try { conn=getConnection(); stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); result=stmt.executeUpdate(sql); }catch(SQLException ex) { result=0; } return result; } public void close() { try { if(rs!=null) { rs.close(); } if(stmt!=null) { stmt.close(); } if(conn!=null) { conn.close(); } }catch(Exception e) { e.printStackTrace(System.err); } } } ``` //struts-config ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="managerForm" type="com.actionForm.ManagerForm" /> <form-bean name="ParameterForm" type="com.actionForm.ParameterForm" /> </form-beans> <action-mappings type="org.apache.struts.action.ActionMapping"> <action name="managerForm" path="/manager" scope="request" type="com.action.Manager" validate="true"> <forward name="managerLoginok" path="/main.jsp" /> <forward name="error" path="/error.jsp" /> </action> <action name="ParameterForm" path="/parameter" scope="request" type="com.action.Parameter" validate="true"> <forward name="error" path="/error.jsp" /> <forward name="parametermodify" path="/parameter_ok.jsp?para=2" /> <forward name="parametermodifyQuery" path="/parameter_modify.jsp" /> </action> </action-mappings> <message-resources parameter="com.wgh.struts.ApplicationResources" /> </struts-config> ```
用file上传的服务器,存到数据库中
jsp :代码 ``` <div class="main"> <h2>添加商品</h2> <div class="manage"> <form enctype="multipart/form-data" method="post" action="/emw/XFL.do" > <table class="form"> <tr> <td class="field">商品名称:</td> <td><input type="text" id="spmic" class="text" name="productName" onblur="return check()"/></td> </tr> <tr> <td class="field">所属分类:</td> <td> <select name="parentId"> <% List<XLm> li=new XLmBizimpl().getAll(); for(XLm n:li){ %> <option value="<%=n.getXflid() %>"><%=n.getXflname() %></option> <% } %> </select> </td> </tr> <tr> <td class="field">商品图片:</td> <td><input type="file" id="photo" class="text" name="filepath" /></td> </tr> <tr> <td class="field">商品价格:</td> <td><input type="text" id="jiage" class="text tiny" name="jiage" onblur="return moing()" /> 元</td> </tr> <tr> <td class="field">库存:</td> <td><input type="text" id="kucun" class="text tiny" name="kuchun" onblur="return moing1()" /></td> </tr> <tr> <td class="field">条码号:</td> <td><input type="text" id="tiaoma" class="text" name="tiaoma" onblur="return moing2()"/></td> </tr> <tr> <td></td> <td><label class="ui-blue"><input type="submit" name="submit" value="添加" /></label></td> </tr> </table> </form> ``` sevlre: package com.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspFactory; import javax.servlet.jsp.PageContext; import com.biz.impl.GoodsBizimpl; import com.biz.impl.XLmBizimpl; import com.entity.Goods; import com.entity.XLm; import com.jspsmart.upload.Files; import com.jspsmart.upload.SmartUpload; public class XFL extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String productName=request.getParameter("productName"); int parentId=Integer.parseInt(request.getParameter("parentId")); //String filepath=request.getParameter("filepath"); //int jiage=Integer.parseInt( request.getParameter("jiage")); double jiage=Double.parseDouble(request.getParameter("jiage")); int kuchun=Integer.parseInt( request.getParameter("kuchun")); String tiaoma=request.getParameter("tiaoma"); //创建一个上传的组件 SmartUpload su = new SmartUpload(); //初始化SmartUpload对象(重) su.initialize(JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8*1024, true)); //pageContext上下文 -- application com.jspsmart.upload.File file = null; //非IO包下的File类 String filepath = null; com.jspsmart.upload.Request req = null; //定义允许上传类型 String allowed = "gif,jpg,png,txt"; //定义不许上传类型 String denied = "jsp,asp,php,aspx,html,htm,exe,bat"; //文件上传类型,二选一,一般会选择允许上传类型 //定义上传文件大小 int file_size = 5*1024*1024; //不能超过2M String exceptionMsg = null; //异常信息对象 //int i = 0; try { //定义允许上传文件类型 su.setAllowedFilesList(allowed); //不允许上传文件类型 su.setDeniedFilesList(denied); //单个文件最大限制 su.setMaxFileSize(file_size); //设置上传对象的编码 su.setCharset("utf-8"); //GBK GB2312 //执行上传(重) su.upload(); //路径 //得到单个上传文件的信息 //file = su.getFiles().getFile(0); //su.getFiles()获得所有文件对象 //su.getFiles()获得所有文件对象 Files f= su.getFiles(); //循环读取文件对象 for(int i=0; i<f.getCount(); i++){ //取文件对象 file=f.getFile(i); //判断是否有对象 if(!file.isMissing()){ //设置文件在服务器的保存位置 filepath = "upload\\"; //保存到一个upload的文件夹下 //filepath += file.getFileName(); //拼接文件名字 filepath += System.currentTimeMillis()+ file.getFileName().substring( file.getFileName().lastIndexOf(".")); //文件另存为 file.setCharset("utf-8"); //保存(重) file.saveAs(filepath, SmartUpload.SAVE_VIRTUAL); //上传模式 } } } catch (Exception e) { exceptionMsg = e.getMessage(); e.printStackTrace(); } response.getWriter().print(filepath); System.out.println(productName+" "+ parentId+" "+ filepath+" "+ jiage +" "+kuchun +" "+tiaoma); } } 错误:SEVERE: Servlet.service() for servlet [XFL] in context with path [/emw] threw exception java.lang.NumberFormatException: null at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at com.servlet.XFL.doPost(XFL.java:42) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2517) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2506) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) -- 问题:获取的值是空值
我如下遍历之后添加一级菜单没事,但是添加二级的时候菜单的值就是未定义,可以成功添加到数据库,求大神指教
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <link rel="stylesheet" type="text/css" href="css/shopbs/catalogDesign.css"> <div class="addDirectory-content"> <div class="addDirectory" id="addDirectoryNavigation"> <div class="addDirectoryLeft"> <label id="labels">添加菜单<img src="img/order/jia (2).png" /></label> </div> <div class=addDirectoryRight> <button type="button" onclick="addShopmenus()">保存</button> </div> </div> <div class="addMenu"> <c:forEach items="${shopmenulist }" var="navigations"> <div class="aNavigationBar aNavigationBar-list"> <ul class="clearfix navigationOne"> <li class="oneType">一级菜单</li> <li>名称&nbsp:&nbsp<span>${navigations.name }</span></li> <li>序号&nbsp:&nbsp<span>${navigations.sort }</span></li> <li>类型&nbsp:&nbsp<span>${navigations.type }</span></li> <li><form id="shopmenus_id" method="post"> <label for="select"> </label> <select name="select">操作 <option value="1">修改</option> </select> <input type="text" id="shopmenu_name" name="name" value="${navigations.name}"> <input type="text" id="shopmenu_sort" name="sort" value="${navigations.sort}"> <input type="text" id="shopmenu_type" name="type" value="${navigations.type}"> <input type="hidden" id="shopmenu_id" name="id" value="${navigations.id}"> <input type="button" value="保存" onclick="updatemenus_first()"> </form></li> <li class="addNavigation"><img src="img/order/jia (2).png" title="添加二级菜单" onclick="getId('${navigations.id}');" /></li> </ul> <div class="navigationTwo"> <c:forEach items="${navigations.submenus }" var="list"> <ul class="clearfix"> <li class="oneType">二级菜单</li> <li>名称&nbsp:&nbsp<span>${list.name }</span></li> <li>序号&nbsp:&nbsp<span>${list.sort }</span></li> <li>类型&nbsp:&nbsp<span>${list.type }</span></li> <li> <form id="secondsmenus" method="post"> <label for="select"> </label> <select name="select">操作 <option value="1">修改</option> </select> <input type="text" id="list_name" name="name" value="${list.name }"> <input type="text" id="list_sort" name="sort" value="${list.sort }"> <input type="text" id="list_type" name="type" value="${list.type }"> <input type="hidden" id="list_id" name="name" value="${list.id }"> <input type="button" value="保存" onclick="updatemenus_second()"> </form> </li> <li class="addNavigation"> <!-- <img src="img/order/jia (2).png" /> --> </li> </ul> </c:forEach> <ul class="clearfix addnavigationTwo"> <li class="oneType">二级菜单</li> <li>名称&nbsp:&nbsp<input id="shopname" name="name" /></li> <li>序号&nbsp:&nbsp<input id="${navigations.id }" name="sort" /></li> <li>类型&nbsp:&nbsp<input id="shoptype" name="type" value="0" /></li> <li> <form name="form1" method="post"> <label for="select"> </label> <select name="select"> <option value="1">操作</option> <option value="2">删除</option> <option value="3">修改</option> </select> </form> </li> <li class="addNavigation"> <!-- <img src="img/order/jia (2).png" /> --> </li> </ul> </div> </div> </c:forEach> </div> <div class="aNavigationBar" id="addAbusinessCategory"> <ul class="clearfix"> <li class="oneType">一级菜单</li> <li>名称&nbsp:&nbsp<input id="first_names" name="name" /></li> <li>序号&nbsp:&nbsp<input id="first_sorts" name="sort" /></li> <li>类型&nbsp:&nbsp<input id="first_types" name="type" value="0" /></li> <li> <form name="form1" method="post"> <label for="select"> </label> <select name="select"> <option value="1">操作</option> <option value="2">删除</option> <option value="3">修改</option> </select> </form> </li> <li class="addNavigation"><img src="img/order/jia (2).png" /></li> </ul> </div> <input type="hidden" id="shopmenu_shopId"> </div> <script type="text/javascript"> $("#addDirectoryNavigation").mouseover(function() { $("#addDirectoryLeft .addDirectoryLeft").show(); }).mouseleave(function() { $("#addDirectoryLeft .addDirectoryLeft").hide(); }) $("#addDirectoryNavigation .addDirectoryLeft label").click(function() { $(".aNavigationBar").show(); }); $(" .addNavigation img").click(function() { $("#twoTypesOfBusinesses").show(); }); $(function() { $(".aNavigationBar").on( "click", ".addNavigation", function() { $(this).parents(".aNavigationBar") .find(".addnavigationTwo").show(); }); }); function getId(id, index) { $("#shopmenu_shopId").val(id); } function addShopmenus() { var parinfo = $("#shopmenu_shopId").val(); $("#shopmenu_shopId").val(""); if (parinfo == "" || parinfo == null) { $.ajax({ type : "POST", url : "merchantcenter/addcatalogDesign", data : { name : $("#first_names").val(), sort : $("#first_sorts").val(), type : $("#first_types").val(), }, success : function(result) { if (result.status == 1) { alertMsg.correct("添加一级菜单成功"); $("#navigationDesign").click(); } else { alertMsg.error("非法操作"); } } }); } else { $.ajax({ type : "POST", url : "merchantcenter/addsubshopmenu", data : { name : $("#shopname").val(), sort : $("#" + parinfo + "").val(), parentId : parinfo, type : $("#shoptype").val(), }, success : function(result) { if (result.status == 1) { alertMsg.correct("添加二级菜单成功"); $("#navigationDesign").click(); } else { alertMsg.error("非法操作"); } } }); } } function updatemenus_first() { $.ajax({ type : "POST", url : "merchantcenter/updateShopmenus", data : { id : $("#shopmenu_id").val(), name : $("#shopmenu_name").val(), sort : $("#shopmenu_sort").val(), type : $("#shopmeun_type").val(), }, success : function(result) { if (result.status == 1) { alertMsg.correct("更新一级菜单成功"); $("#navigationDesign").click(); } else { alertMsg.error("更新失败"); } } }); } function updatemenus_second() { $.ajax({ type : "POST", url : "merchantcenter/updateShopmenus", data : { id : $("#list_id").val(), name : $("#list_name").val(), sort : $("#list_sort").val(), type : $("#list_type").val(), }, success : function(result) { if (result.status == 1) { alertMsg.correct("更新二级菜单成功"); $("#navigationDesign").click(); } else { alertMsg.error("更新失败"); } } }); } </script> 这是前台遍历与添加菜单的代码 /** * 跳转目录设计 */ @RequestMapping(value = "/tocatalogDesign") public ModelAndView tocatalogDesign(HttpServletRequest request) { Map<String, Object> result = new HashMap<String, Object>(); Shop shop = (Shop)request.getSession().getAttribute("shop"); List<Shopmenu>shopmenulist = shopmenuService.queryBySqlQuery("from Shopmenu sm where sm.parentId is null and sm.type=0 and sm.shop.id=?", new Object[]{shop.getId()}); result.put("shopmenulist", shopmenulist); return new ModelAndView("shopbs/order/catalogDesign",result); } /** * 目录设计 一级菜单 */ @RequestMapping(value="/addcatalogDesign",method = RequestMethod.POST) @ResponseBody public Map<String, Object> addcatalogDesign (HttpServletRequest request,Shopmenu shopmenu){ System.out.println("进入非法"); Map<String, Object>result = new HashMap<String,Object>(); Shop shop = (Shop)request.getSession().getAttribute("shop"); String warnInfo = ""; int status = 0; if(Common.isNull(shopmenu.getParentId())){ shopmenu.setShop(shop); shopmenu.setType(0); shopmenuService.save(shopmenu); warnInfo = "添加一级菜单成功"; status = 1; } result.put("warnInfo", warnInfo); result.put("status", status); return result; } /** * 目录设计 二级菜单 */ @RequestMapping(value="/addsubshopmenu",method = RequestMethod.POST) @ResponseBody public Map<String, Object> addsubshopmenu(HttpServletRequest request,Shopmenu shopmenu){ System.out.println("进入合法"); Map<String, Object>result = new HashMap<String,Object>(); Shop shop = (Shop)request.getSession().getAttribute("shop"); String warnInfo = ""; int status = 0; if(!Common.isNull(shopmenu.getParentId())){ shopmenu.setShop(shop); shopmenu.setType(0); shopmenuService.save(shopmenu); warnInfo = "添加二级菜单成功"; status = 1; }else{ warnInfo = "非法操作"; } result.put("warnInfo", warnInfo); result.put("status", status); return result; } 这是后台查询及添加菜单代码
jqgrid获取不到后台数据,大神帮忙看一下
下面是 页面部分: ``` <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=urf-8"> <title>调度任务列表</title> <style type="text/css">@import url('${pageContext.request.contextPath}/styles/home.css'); .selected{ background:#F0F0F0;} @import url('${pageContext.request.contextPath}/css/jquery-ui-1.8.4.custom.css'); @import url('${pageContext.request.contextPath}/css/ui.jqgrid.css'); </style> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-migrate-1.2.1.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/grid.locale-zh_CN.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.jqGrid.min.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/grid.custom.js"></script> <%-- <script type="text/javascript" src="${pageContext.request.contextPath}/js/common/triggerList.js"></script> --%> <script type="text/javascript"> $(function() { $("#tableList").jqGrid({ url : "${pageContext.request.contextPath}/JobProcessServlet?jobtype=100&action=query", // 提交的action地址 rownumbers : true, // 是否显示前面的行号 datatype : "json", // 返回的数据类型 mtype : "post", // 提交方式 height : "auto", // 表格宽度 autowidth : true, // 是否自动调整宽度 colNames:['Trigger 名称','Trigger 分组','下次执行时间','上次执行时间','优先级','Trigger 状态','Trigger 类型','开始时间','结束时间','操作'], colModel : [ { name : "display_name", index : "display_name", width : 60, sortable : true, align : 'center' }, { name : "trigger_group", index : "trigger_group", width : 60, sortable : true, align : 'center' }, { name : "next_fire_time", index : "next_fire_time", width : 60, sortable : true, align : 'center' }, { name : "prev_fire_time", index : "prev_fire_time", width : 60, sortable : true, align : 'center', }, { name : "priority", index : "priority", width : 60, sortable : true, align : 'center' }, { name : "statu", index : "statu", width : 60, sortable : true, align : 'center' }, { name : "trigger_type", index : "trigger_type", width : 60, sortable : true, align : 'center' }, { name : "start_time", index : "start_time", width : 60, sortable : true, align : 'center' }, { name : "end_time", index : "end_time", width : 60, sortable : true, hidden : true, align : 'center' } , { name : "process", index : "process", sortable : true, hidden : true, align : 'center' }], gridComplete : function() { $("#_empty", "#tableList") .addClass("nodrag nodrop"); $("#tableList").tableDnDUpdate(); var ids = jQuery("#tableList").jqGrid('getDataIDs'); for ( var i = 0; i < ids.length; i++) { var cl = ids[i]; update = "<input type='button' id='update' value='修改作业表达式' onclick='update(" + cl + ")'/>&nbsp;"; runOnce = "<input type='button' id='runOnce' value='立即执行一次' onclick='runOnce(" + cl + ")'/>&nbsp;"; pause = "<input type='button' id='runOnce' value='暂停' onclick='doCmd(" + cl + ")'/>&nbsp;"; recolve = "<input type='button' id='runOnce' value='恢复' onclick='doCmd(" + cl + ")'/>&nbsp;"; del = "<input type='button' id='runOnce' value='删除' onclick='doCmd(" + cl + ")'/>&nbsp;"; jQuery("#tableList").jqGrid('setRowData', ids[i], { process : update + runOnce + pause + recolve + del }); } }, viewrecords : true, sortname : "display_name", rowNum : 20, rowList : [10, 15, 20], prmNames : { search : "search" }, jsonReader : { root : "dataList", // 服务端保存数据的集合 repeatitems : false, page: "page", total: "total", records: "records", cell: "dataList", }, pager : "gridPager", hidegrid : false }); }); </script> </head> <body> <br><br> <table align="center" width="1100" border="0"> <tr> <td align="left"><a href="${pageContext.request.contextPath}/addTrigger.jsp">添加调度任务</a></td> </tr> <tr> <td align="left"><a href="${pageContext.request.contextPath}/logdb">查看作业日志表</a></td> </tr> <tr> <td align="left"><a href="${pageContext.request.contextPath}/compleData.htm">补数</a></td> </tr> </table> <div align="center" style="margin-bottom:5px"> <input type="button" id="update" style="margin-right:10px;" value="修改作业表达式" onclick="update()"> <input type="button" id="runOnce" style="margin-right:10px;" value="立即执行一次" onclick="runOnce()"> <input type="button" id="pause" style="margin-right:10px;" value="暂停" onclick="doCmd('pause')"> <input type="button" id="resume" style="margin-right:10px;" value="恢复" onclick="doCmd('resume')"> <input type="button" id="remove" style="margin-right:10px;" value="删除" onclick="doCmd('remove')"> </div> <table id="tableList"></table> <div id ="gridPager"></div> <%-- <table id="tableList" align="center" width="1100" border="1"> <tr> <th nowrap> 选择 </th> <th nowrap> Trigger 名称 </th> <th nowrap> Trigger 分组 </th> <th nowrap> 下次执行时间 </th> <th nowrap> 上次执行时间 </th> <th nowrap> 优先级 </th> <th nowrap> Trigger 状态 </th> <th nowrap> Trigger 类型 </th> <th nowrap> 开始时间 </th> <th nowrap> 结束时间 </th> <!-- <th nowrap> 动作命令 </th> --> </tr> <c:forEach var="map" items="${list}"> <tr align="center"> <td nowrap> <input type="checkbox" value="${map.trigger_name}"> </td> <td nowrap> ${map.display_name} </td> <td nowrap> ${map.trigger_group} </td> <td nowrap> ${map.next_fire_time} </td> <td nowrap> ${map.prev_fire_time} </td> <td nowrap> ${map.priority} </td> <td nowrap> ${map.statu} </td> <td nowrap> ${map.trigger_type} </td> <td nowrap> ${map.start_time} </td> <td nowrap> ${map.end_time} </td> <td nowrap> <input type="button" id="update" value="修改作业表达式" onclick="update('${map.trigger_name}','${map.job_name}')"> <input type="button" id="runOnce" value="立即执行一次" onclick="runOnce('${map.job_name}')"> <input type="button" id="pause" value="暂停" onclick="doCmd('pause','${map.trigger_name}','${map.trigger_group}','${map.trigger_state}')"> <input type="button" id="resume" value="恢复" onclick="doCmd('resume','${map.trigger_name}','${map.trigger_group}','${map.trigger_state}')"> <input type="button" id="remove" value="删除" onclick="doCmd('remove','${map.trigger_name}','${map.trigger_group}','${map.trigger_state}')"> </td> </tr> </c:forEach> </table> --%> </body> </html> 下面是java部分: private void getQrtzTriggers(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); List<Map<String, Object>> results = this.schedulerService .getQrtzTriggers(); String page = request.getParameter("page"); // 取得当前页数,注意这是jqgrid自身的参数 int rows = 20; int qrtzTriggers = this.schedulerService.countQrtzTriggers(); JSONObject json = new JSONObject(); json.put("dataList", results); json.put("records", qrtzTriggers);//总记录数 json.put("page", page); // 当前页 int total = qrtzTriggers/rows + ((qrtzTriggers%rows)>0?1:0); //计算得出的总页数 json.put("total", total); // 总页数 //System.out.println(rows); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); out.write(json.toString()); System.out.println(json.toString()); /*request.setAttribute("list", results);*/ request.getRequestDispatcher("/list.jsp").forward(request, response); } ```
mysql过滤条件,怎么添加过滤的表?
package eb.controller.core; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.UnavailableException; import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException; /** * @author Bicashy,fencer911(for Mysql Version) */ public class TableOperate { static Statement stmt = null; static Connection conn = null; static Map map = new HashMap(); //用来保存已经删除了的表的集合 static Map filterMap = new HashMap(); //用来保存需要过滤的表的集合 static String schema ; /** * 获得数据库链接 * @return */ private static Connection getConnection(){ try { Class.forName( "com.mysql.jdbc.Driver").newInstance(); //String url= "jdbc:oracle:thin:@10.45.10.177:1521:highway"; String url= "jdbc:mysql://localhost:3306/eb?useUnicode=true&characterEncoding=utf-8"; String user= "root"; String password= "eryue1818**"; schema = user; conn = DriverManager.getConnection(url,user,password); return conn; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 获得该用户的所有表,并删除表(除了要过滤的表) */ private static void findDeleteTableSQL(){ if(conn!=null){ try { stmt=conn.createStatement(); String sql = "show TABLES"; //找到该链接用户的所有表 ResultSet rs=stmt.executeQuery(sql); while(rs.next()){ String tabName = rs.getString(1); //getString("table_name"); //如果map中包含了表名,说明已经删除过了 //如果filterMap中包含了表名,则不删除 if(!map.containsKey(tabName)&&!filterMap.containsKey(tabName)){ printDeleteTableSQL(tabName); } } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * * 删除表,并将删除表的语句输出到控制台(记录后方便在数据库客户端执行) * @param l * @param tableName * @return */ private static void printDeleteTableSQL(String tableName){ String sql = "DELETE FROM "+tableName.toUpperCase(); try { stmt=conn.createStatement(); System.out.println(sql+";"); stmt.execute(sql); stmt.close(); //将删除语句输出到控制台 map.put(tableName,null); } catch (MySQLIntegrityConstraintViolationException e) { // TODO Auto-generated catch block String error = e.toString(); System.out.println(error); int p1=error.indexOf("("); int p2=error.indexOf("FOREIGN KEY"); error=error.substring(p1, p2); int p3=error.indexOf("CONSTRAINT"); error=error.substring(p3); error=error.replaceAll("CONSTRAINT", "").replaceAll(" ", "").replaceAll("`", ""); //截取错误信息得到外键约束名称 String fk_constraints =error; System.out.println("fk_constraints"+fk_constraints); deleteTableNameFromFK(fk_constraints); //删除外键约束表后,就可以将本表删掉 printDeleteTableSQL(tableName); }catch (Exception e) { System.out.println(e.toString()); } } /** * 删除通过外键约束找到的有子记录的表 * @param fk_constraints */ private static void deleteTableNameFromFK(String fk_constraints){ String sql = "select table_name from information_schema.REFERENTIAL_CONSTRAINTS where constraint_schema='laidong8v5' and constraint_name='"+fk_constraints+"'"; try { ResultSet rs=stmt.executeQuery(sql); while(rs.next()){ String tabN = rs.getString("table_name"); printDeleteTableSQL(tabN);//递归 } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 初始化需要过滤表的集合(该表如果是别的表的外键关联表也有可能被删除) */ private static void initFilterMap(){ String[] tables = {"ETC_USER","etc_dic_data","MENU","admin"}; for (int j = 0; j < tables.length; j++) { filterMap.put(tables[j].toUpperCase(),null); } } public static void main(String[] args) { getConnection(); //initFilterMap();//初始化不需要删除的表 //删除该用户下所有表(除了需要过滤的),并获得删除语句 findDeleteTableSQL(); //删除某一个表(有外键约束的表将先删除),并获得删除语句 //printDeleteTableSQL("obu_mast"); } } 在外面看到,试了之后发现它把所有的表全都删除了,现在不知道怎么添加过滤的表,该怎么写。
想用树莓派做行人识别,不知道可以吗
先在树莓派上装c++版的opencv,用板子上的csi摄像头采集图像,然后用HOG特征和SVM来检测其中的行人。不知道树莓派算力够吗? 想把这个程序写进去。 ``` #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/ml/ml.hpp> using namespace std; using namespace cv; #define PosSamNO 1114 //正样本个数 #define NegSamNO 12180 //负样本个数 #define TRAIN true//是否进行训练,true表示重新训练,false表示读取xml文件中的SVM模型 #define CENTRAL_CROP false //true:训练时,对96*160的INRIA正样本图片剪裁出中间的64*128大小人体 //HardExample:负样本个数。如果HardExampleNO大于0,表示处理完初始负样本集后,继续处理HardExample负样本集。 //不使用HardExample时必须设置为0,因为特征向量矩阵和特征类别矩阵的维数初始化时用到这个值 #define HardExampleNO 433 //继承自CvSVM的类,因为生成setSVMDetector()中用到的检测子参数时,需要用到训练好的SVM的decision_func参数, //但通过查看CvSVM源码可知decision_func参数是protected类型变量,无法直接访问到,只能继承之后通过函数访问 class MySVM : public CvSVM { public: //获得SVM的决策函数中的alpha数组 double * get_alpha_vector() { return this->decision_func->alpha; } //获得SVM的决策函数中的rho参数,即偏移量 float get_rho() { return this->decision_func->rho; } }; int main() { //检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9 HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG检测器,用来计算HOG描述子的 int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定 MySVM svm;//SVM分类器 //若TRAIN为true,重新训练分类器 if(TRAIN) { string ImgName;//图片名(绝对路径) ifstream finPos("d:/hogmit/pos/pos.txt");//正样本图片的文件名列表 //ifstream finPos("PersonFromVOC2012List.txt");//正样本图片的文件名列表 ifstream finNeg("d:/hogmit/neg/neg.txt");//负样本图片的文件名列表 Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数 Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人 //依次读取正样本图片,生成HOG描述子 for(int num=0; num<PosSamNO && getline(finPos,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; //ImgName = "D:\\DataSet\\PersonFromVOC2012\\" + ImgName;//加上正样本的路径名 ImgName = "d:/hogmit/pos/" + ImgName;//加上正样本的路径名 Mat src = imread(ImgName);//读取图片 if(CENTRAL_CROP) src = src(Rect(16,16,64,128));//将96*160的INRIA正样本图片剪裁为64*128,即剪去上下左右各16个像素 //resize(src,src,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) // cout<<"描述子维数:"<<descriptors.size()<<endl; //处理第一个样本时初始化特征向量矩阵和类别矩阵,因为只有知道了特征向量的维数才能初始化特征向量矩阵 if( 0 == num ) { DescriptorDim = descriptors.size();//HOG描述子的维数 //初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMat sampleFeatureMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, DescriptorDim, CV_32FC1); //初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人 sampleLabelMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, 1, CV_32FC1); } //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num,i) = descriptors[i];//第num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num,0) = 1;//正样本类别为1,有人 } //依次读取负样本图片,生成HOG描述子 for(int num=0; num<NegSamNO && getline(finNeg,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/neg/" + ImgName;//加上负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO,0) = -1;//负样本类别为-1,无人 } //处理HardExample负样本 if(HardExampleNO > 0) { ifstream finHardExample("d:/hogmit/hard/hard.txt");//HardExample负样本的文件名列表 //依次读取HardExample负样本图片,生成HOG描述子 for(int num=0; num<HardExampleNO && getline(finHardExample,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/hard/" + ImgName;//加上HardExample负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO+NegSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO+NegSamNO,0) = -1;//负样本类别为-1,无人 } } //输出样本的HOG特征向量矩阵到文件 ofstream fout("d:/xlw/SampleFeatureMat.txt"); for(int i=0; i<PosSamNO+NegSamNO; i++) { fout<<i<<endl; for(int j=0; j<DescriptorDim; j++) { fout<<sampleFeatureMat.at<float>(i,j)<<" "; } fout<<endl; } //训练SVM分类器 //迭代终止条件,当迭代满1000次或误差小于FLT_EPSILON时停止迭代 CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON); //SVM参数:SVM类型为C_SVC;线性核函数;松弛因子C=0.01 CvSVMParams param(CvSVM::C_SVC, CvSVM::LINEAR, 0, 1, 0, 0.01, 0, 0, 0, criteria); cout<<"开始训练SVM分类器"<<endl; double time0=static_cast<double>(getTickCount()); svm.train(sampleFeatureMat,sampleLabelMat, Mat(), Mat(), param);//训练分类器 time0=((double)getTickCount()-time0)/getTickFrequency(); cout<<"训练完成"<<endl; cout<<"训练花费时间:"<<time0<<endl; svm.save("d:/xlw/SVM_HOG_mit_inria(1114pos+12180neg+433hard).xml");//将训练好的SVM模型保存为xml文件 } else //若TRAIN为false,从XML文件读取训练好的分类器 { cout<<"fail train"<<endl; //svm.load("SVM_HOG_2400PosINRIA_12000Neg_HardExample(误报少了漏检多了).xml");//从XML文件读取训练好的SVM模型 svm.load("d:/LBP/SVM_Model.xml"); } /************************************************************************************************* 线性SVM训练完成后得到的XML文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho; 将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。 如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), 就可以利用你的训练样本训练出来的分类器进行行人检测了。 ***************************************************************************************************/ DescriptorDim = svm.get_var_count();//特征向量的维数,即HOG描述子的维数 int supportVectorNum = svm.get_support_vector_count();//支持向量的个数 cout<<"支持向量个数:"<<supportVectorNum<<endl; Mat alphaMat = Mat::zeros(1, supportVectorNum, CV_32FC1);//alpha向量,长度等于支持向量个数 Mat supportVectorMat = Mat::zeros(supportVectorNum, DescriptorDim, CV_32FC1);//支持向量矩阵 Mat resultMat = Mat::zeros(1, DescriptorDim, CV_32FC1);//alpha向量乘以支持向量矩阵的结果 //将支持向量的数据复制到supportVectorMat矩阵中 for(int i=0; i<supportVectorNum; i++) { const float * pSVData = svm.get_support_vector(i);//返回第i个支持向量的数据指针 for(int j=0; j<DescriptorDim; j++) { //cout<<pData[j]<<" "; supportVectorMat.at<float>(i,j) = pSVData[j]; } } //将alpha向量的数据复制到alphaMat中 double * pAlphaData = svm.get_alpha_vector();//返回SVM的决策函数中的alpha向量 for(int i=0; i<supportVectorNum; i++) { alphaMat.at<float>(0,i) = pAlphaData[i]; } //计算-(alphaMat * supportVectorMat),结果放到resultMat中 //gemm(alphaMat, supportVectorMat, -1, 0, 1, resultMat);//不知道为什么加负号? resultMat = -1 * alphaMat * supportVectorMat; //得到最终的setSVMDetector(const vector<float>& detector)参数中可用的检测子 vector<float> myDetector; //将resultMat中的数据复制到数组myDetector中 for(int i=0; i<DescriptorDim; i++) { myDetector.push_back(resultMat.at<float>(0,i)); } //最后添加偏移量rho,得到检测子 myDetector.push_back(svm.get_rho()); cout<<"检测子维数:"<<myDetector.size()<<endl; //设置HOGDescriptor的检测子 HOGDescriptor myHOG; myHOG.setSVMDetector(myDetector); //myHOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //保存检测子参数到文件 ofstream fout("d:/xlw/HOGDetectorForOpenCV.txt"); for(int i=0; i<myDetector.size(); i++) { fout<<myDetector[i]<<endl; } /**************读入图片进行HOG行人检测******************/ Mat src = imread("d:/timg.png"); //Mat src = imread("2007_000423.jpg"); //Mat src = imread("1.png"); vector<Rect> found, found_filtered;//矩形框数组 cout<<"进行多尺度HOG人体检测"<<endl; myHOG.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图片进行多尺度行人检测 //src为输入待检测的图片;found为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离; //参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即测试图片每次尺寸缩放增加的比例; //参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。 cout<<"找到的矩形框个数:"<<found.size()<<endl; //找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中 for(int i=0; i < found.size(); i++) { Rect r = found[i]; int j=0; for(; j < found.size(); j++) if(j != i && (r & found[j]) == r) break; if( j == found.size()) found_filtered.push_back(r); } //画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整 for(int i=0; i<found_filtered.size(); i++) { Rect r = found_filtered[i]; r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3); } imwrite("d:/SVM/ImgProcessed3.jpg",src); namedWindow("src",0); imshow("src",src); waitKey();//注意:imshow之后必须加waitKey,否则无法显示图像 /******************读入单个64*128的测试图并对其HOG描述子进行分类*********************/ ////读取测试图片(64*128大小),并计算其HOG描述子 //Mat testImg = imread("person014142.jpg"); //Mat testImg = imread("noperson000026.jpg"); //vector<float> descriptor; //hog.compute(testImg,descriptor,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //Mat testFeatureMat = Mat::zeros(1,3780,CV_32FC1);//测试样本的特征向量矩阵 //将计算好的HOG描述子复制到testFeatureMat矩阵中 //for(int i=0; i<descriptor.size(); i++) // testFeatureMat.at<float>(0,i) = descriptor[i]; //用训练好的SVM分类器对测试图片的特征向量进行分类 //int result = svm.predict(testFeatureMat);//返回类标 //cout<<"分类结果:"<<result<<endl; system("pause"); } ```
hadoop集群,hdfs dfs -ls / 目录出错
搭建了一个hadoop集群,用hdfs dfs -ls /命令,列出的是本地系统的根目录。 用hdfs dfs -ls hdfs://servicename/ 列出的目录才是hdfs上的目录,可能是什么原因? 执行hive创建的目录也是在本地系统目录上。 集群的配置如下 集群规划: 主机名 IP 安装的软件 运行的进程 hadoop01 192.168.175.129 jdk、hadoop NameNode、DFSZKFailoverController(zkfc) hadoop02 192.168.175.127 jdk、hadoop NameNode、DFSZKFailoverController(zkfc) hadoop03 192.168.175.126 jdk、hadoop ResourceManager hadoop04 192.168.175.125 jdk、hadoop ResourceManager hadoop05 192.168.175.124 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain hadoop06 192.168.175.123 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain hadoop07 192.168.175.122 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain windows:NLB LINUX:LVS 1.liunx虚拟机安装后,虚拟机连接模式要选择host-only模式。然后分配IP(以hadoop01为例) DEVICE="eth0" BOOTPROTO="static" ### HWADDR="00:0C:29:3C:BF:E7" IPV6INIT="yes" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" UUID="ce22eeca-ecde-4536-8cc2-ef0dc36d4a8c" IPADDR="192.168.175.129" ### NETMASK="255.255.255.0" ### GATEWAY="192.168.175.1" ### 2.修改主机名: vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=hadoop01 ### 3.关闭防火墙: #查看防火墙状态 service iptables status #关闭防火墙 service iptables stop #查看防火墙开机启动状态 chkconfig iptables --list #关闭防火墙开机启动 chkconfig iptables off 4.免登录配置: #生成ssh免登陆密钥 #进入到我的home目录 cd ~/.ssh ssh-keygen -t rsa (四个回车) 执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥) 将公钥拷贝到要免登陆的机器上 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 或 若报错ssh-copy-id: ERROR: No identities found,是因为找不到公钥路径,加上-i然后再加上路径即可 则用 $ ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_ip 5.主机IP映射关系(/etc/hosts每台机器上都要配置全部映射关系) 192.168.175.129 hadoop01 192.168.175.127 hadoop02 192.168.175.126 hadoop03 192.168.175.125 hadoop04 192.168.175.124 hadoop05 192.168.175.123 hadoop06 192.168.175.122 hadoop07 6./etc/profile下配置java环境变量: export JAVA_HOME=/lichangwu/jdk1.7.0_79 export PATH=$PATH:$JAVA_HOME/bin #刷新profile source /etc/profile 若版本报错,vi /etc/selinux/config,设置SELINUX=disabled,然后重启虚拟机 7.安装zookeeper: 1.安装配置zooekeeper集群(在hadoop05上): 1.1解压 tar -zxvf zookeeper-3.4.6.tar.gz -C /lichangwu/ 1.2修改配置 cd /lichangwu/zookeeper-3.4.6/conf/ cp zoo_sample.cfg zoo.cfg vim zoo.cfg 修改:dataDir=/lichangwu/zookeeper-3.4.6/tmp 在最后添加: server.1=hadoop05:2888:3888 server.2=hadoop06:2888:3888 server.3=hadoop07:2888:3888 保存退出 然后创建一个tmp文件夹 mkdir /lichangwu/zookeeper-3.4.6/tmp 再创建一个空文件 touch /lichangwu/zookeeper-3.4.6/tmp/myid 最后向该文件写入ID echo 1 > /lichangwu/zookeeper-3.4.6/tmp/myid 1.3将配置好的zookeeper拷贝到其他节点(首先分别在hadoop06、hadoop07根目录下创建一个lichangwu目录:mkdir /lichangwu) scp -r /lichangwu/zookeeper-3.4.6/ hadoop06:/lichangwu/ scp -r /lichangwu/zookeeper-3.4.6/ hadoop07:/lichangwu/ 注意:修改hadoop06、hadoop07对应/lichangwu/zookeeper-3.4.6/tmp/myid内容 itcast06: echo 2 > /lichangwu/zookeeper-3.4.6/tmp/myid itcast07: echo 3 > /lichangwu/zookeeper-3.4.6/tmp/myid 8.安装配置hadoop集群(在hadoop01上操作): 2.1解压 tar -zxvf hadoop-2.4.1.tar.gz -C /lichangwu/ 2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下) #将hadoop添加到环境变量中 vim /etc/profile export JAVA_HOME=/lichangwu/jdk1.7.0_79 export HADOOP_HOME=/lichangwu/hadoop-2.4.1 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下 cd /lichangwu/hadoop-2.4.1/etc/hadoop 2.2.1修改hadoo-env.sh export JAVA_HOME=/lichangwu/jdk1.7.0_79 2.2.2修改core-site.xml <configuration> <!-- 指定hdfs的nameservice为ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <!-- 指定hadoop临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/lichangwu/hadoop-2.4.1/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value> </property> </configuration> 2.2.3修改hdfs-site.xml <configuration> <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>hadoop01:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>hadoop01:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>hadoop02:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>hadoop02:50070</value> </property> <!-- 指定NameNode的元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop05:8485;hadoop06:8485;hadoop07:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/lichangwu/hadoop-2.4.1/journal</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration> 2.2.4修改mapred-site.xml <configuration> <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> 2.2.5修改yarn-site.xml <configuration> <!-- 开启RM高可靠 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分别指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop03</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop04</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> 2.2.6修改slaves(slaves是指定子节点的位置,因为要在itcast01上启动HDFS、在itcast03启动yarn, 所以itcast01上的slaves文件指定的是datanode的位置,itcast03上的slaves文件指定的是nodemanager的位置) hadoop05 hadoop06 hadoop07 2.2.7配置免密码登陆 #首先要配置itcast01到hadoop02、hadoop03、hadoop04、hadoop05、hadoop06、hadoop07的免密码登陆 #在hadoop01上生产一对钥匙 ssh-keygen -t rsa #将公钥拷贝到其他节点,包括自己 ssh-coyp-id hadoop01 ssh-coyp-id hadoop02 ssh-coyp-id hadoop03 ssh-coyp-id hadoop04 ssh-coyp-id hadoop05 ssh-coyp-id hadoop06 ssh-coyp-id hadoop07 #配置hadoop03到hadoop04、hadoop05、hadoop06、hadoop07的免密码登陆 #在hadoop03上生产一对钥匙 ssh-keygen -t rsa #将公钥拷贝到其他节点 ssh-coyp-id hadoop04 ssh-coyp-id hadoop05 ssh-coyp-id hadoop06 ssh-coyp-id hadoop07 #注意:两个namenode之间要配置ssh免密码登陆,别忘了配置hadoop02到hadoop01的免登陆 在hadoop02上生产一对钥匙 ssh-keygen -t rsa ssh-coyp-id -i hadoop01 2.4将配置好的hadoop拷贝到其他节点 scp -r hadoop-2.4.1/ hadoop02:/lichangwu/hadoop-2.4.1/ scp -r hadoop-2.4.1/ hadoop03:/lichangwu/hadoop-2.4.1/ scp -r hadoop-2.4.1/ hadoop04:/lichangwu/hadoop-2.4.1/ scp -r hadoop-2.4.1/ hadoop05:/lichangwu/hadoop-2.4.1/ scp -r hadoop-2.4.1/ hadoop06:/lichangwu/hadoop-2.4.1/ scp -r hadoop-2.4.1/ hadoop07:/lichangwu/hadoop-2.4.1/ ###注意:严格按照下面的步骤 2.5启动zookeeper集群(分别在hadoop05、hadoop06、hadoop07上启动zk) cd /lichangwu/zookeeper-3.4.6/bin/ ./zkServer.sh start #查看状态:一个leader,两个follower ./zkServer.sh status 2.6启动journalnode(分别在在hadoop05、hadoop06、hadoop07上执行) cd /lichangwu/hadoop-2.4.1 sbin/hadoop-daemon.sh start journalnode #运行jps命令检验,hadoop05、hadoop06、hadoop07上多了JournalNode进程 2.7格式化HDFS #在hadoop01上执行命令: hdfs namenode -format #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件, 这里我配置的是/lichangwu/hadoop-2.4.1/tmp,然后将/lichangwu/hadoop-2.4.1/tmp拷贝到hadoop02的/lichangwu/hadoop-2.4.1/下。 scp -r tmp/ hadoop02:/lichangwu/hadoop-2.4.1/ 2.8格式化ZK(在hadoop01上执行即可) hdfs zkfc -formatZK 2.9启动HDFS(在hadoop01上执行) sbin/start-dfs.sh 2.10启动YARN(#####注意#####:是在hadoop03上执行start-yarn.sh, 如果hadoop04上没有启动成功,则在hadoop04上再启动一次start-yarn.sh; 把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动) sbin/start-yarn.sh 到此,hadoop-2.4.1配置完毕,可以统计浏览器访问: http://192.168.175.129:50070 NameNode 'hadoop01:9000' (active) http://192.168.175.127:50070 NameNode 'hadoop02:9000' (standby)
keras下self-attention和Recall, F1-socre值实现问题?
麻烦大神帮忙看一下: (1)为何返回不了Precise, Recall, F1-socre值? (2)为何在CNN前加了self-attention层,训练后的acc反而降低在0.78上下? 【研一小白求详解,万分感谢大神】 ``` import os #导入os模块,用于确认文件是否存在 import numpy as np from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.callbacks import Callback from sklearn.metrics import f1_score, precision_score, recall_score maxlen = 380#句子长截断为100 training_samples = 20000#在 200 个样本上训练 validation_samples = 5000#在 10 000 个样本上验证 max_words = 10000#只考虑数据集中前 10 000 个最常见的单词 def dataProcess(): imdb_dir = 'data/aclImdb'#基本路径,经常要打开这个 #处理训练集 train_dir = os.path.join(imdb_dir, 'train')#添加子路径 train_labels = [] train_texts = [] for label_type in ['neg', 'pos']: dir_name = os.path.join(train_dir, label_type) for fname in os.listdir(dir_name):#获取目录下所有文件名字 if fname[-4:] == '.txt': f = open(os.path.join(dir_name, fname),'r',encoding='utf8') train_texts.append(f.read()) f.close() if label_type == 'neg': train_labels.append(0) else:train_labels.append(1) #处理测试集 test_dir = os.path.join(imdb_dir, 'test') test_labels = [] test_texts = [] for label_type in ['neg', 'pos']: dir_name = os.path.join(test_dir, label_type) for fname in sorted(os.listdir(dir_name)): if fname[-4:] == '.txt': f = open(os.path.join(dir_name, fname),'r',encoding='utf8') test_texts.append(f.read()) f.close() if label_type == 'neg': test_labels.append(0) else: test_labels.append(1) #对数据进行分词和划分训练集和数据集 tokenizer = Tokenizer(num_words=max_words) tokenizer.fit_on_texts(train_texts)#构建单词索引结构 sequences = tokenizer.texts_to_sequences(train_texts)#整数索引的向量化模型 word_index = tokenizer.word_index#索引字典 print('Found %s unique tokens.' % len(word_index)) data = pad_sequences(sequences, maxlen=maxlen) train_labels = np.asarray(train_labels)#把列表转化为数组 print('Shape of data tensor:', data.shape) print('Shape of label tensor:', train_labels.shape) indices = np.arange(data.shape[0])#评论顺序0,1,2,3 np.random.shuffle(indices)#把评论顺序打乱3,1,2,0 data = data[indices] train_labels = train_labels[indices] x_train = data[:training_samples] y_train = train_labels[:training_samples] x_val = data[training_samples: training_samples + validation_samples] y_val = train_labels[training_samples: training_samples + validation_samples] #同样需要将测试集向量化 test_sequences = tokenizer.texts_to_sequences(test_texts) x_test = pad_sequences(test_sequences, maxlen=maxlen) y_test = np.asarray(test_labels) return x_train,y_train,x_val,y_val,x_test,y_test,word_index embedding_dim = 100#特征数设为100 #"""将预训练的glove词嵌入文件,构建成可以加载到embedding层中的嵌入矩阵""" def load_glove(word_index):#导入glove的词向量 embedding_file='data/glove.6B' embeddings_index={}#定义字典 f = open(os.path.join(embedding_file, 'glove.6B.100d.txt'),'r',encoding='utf8') for line in f: values = line.split() word = values[0] coefs = np.asarray(values[1:], dtype='float32') embeddings_index[word] = coefs f.close() # """转化为矩阵:构建可以加载到embedding层中的嵌入矩阵,形为(max_words(单词数), embedding_dim(向量维数)) """ embedding_matrix = np.zeros((max_words, embedding_dim)) for word, i in word_index.items():#字典里面的单词和索引 if i >= max_words:continue embedding_vector = embeddings_index.get(word) if embedding_vector is not None: embedding_matrix[i] = embedding_vector return embedding_matrix if __name__ == '__main__': x_train, y_train, x_val, y_val,x_test,y_test, word_index = dataProcess() embedding_matrix=load_glove(word_index) #可以把得到的嵌入矩阵保存起来,方便后面fine-tune""" # #保存 from keras.models import Sequential from keras.layers.core import Dense,Dropout,Activation,Flatten from keras.layers.recurrent import LSTM from keras.layers import Embedding from keras.layers import Bidirectional from keras.layers import Conv1D, MaxPooling1D import keras from keras_self_attention import SeqSelfAttention model = Sequential() model.add(Embedding(max_words, embedding_dim, input_length=maxlen)) model.add(SeqSelfAttention(attention_activation='sigmod')) model.add(Conv1D(filters = 64, kernel_size = 5, padding = 'same', activation = 'relu')) model.add(MaxPooling1D(pool_size = 4)) model.add(Dropout(0.25)) model.add(Bidirectional(LSTM(64,activation='tanh',dropout=0.2,recurrent_dropout=0.2))) model.add(Dense(256, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(1, activation='sigmoid')) model.summary() model.layers[0].set_weights([embedding_matrix]) model.layers[0].trainable = False model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) class Metrics(Callback): def on_train_begin(self, logs={}): self.val_f1s = [] self.val_recalls = [] self.val_precisions = [] def on_epoch_end(self, epoch, logs={}): val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round() val_targ = self.validation_data[1] _val_f1 = f1_score(val_targ, val_predict) _val_recall = recall_score(val_targ, val_predict) _val_precision = precision_score(val_targ, val_predict) self.val_f1s.append(_val_f1) self.val_recalls.append(_val_recall) self.val_precisions.append(_val_precision) return metrics = Metrics() history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val), callbacks=[metrics]) model.save_weights('pre_trained_glove_model.h5')#保存结果 ```
如何实现js同一页面的值的传递,希望热心大佬帮助一下我,菜鸟实习生,没有c币。。。。。。。。
我现在在做一个退伍军人就业信息管理的模块,现在我要和另一模块退伍军人基本信息连接到一起,基本信息里面没有这个用户我就无法添加就业信息,现在我要做的是点击就业信息模块主界面点击添加信息按钮,跳转到如下界面![图片说明](https://img-ask.csdn.net/upload/201905/05/1557026572_514791.jpg), 我需要在搜索框输入用户名搜索姓名查询基本信息表内有无该用户,有该用户则会显示在下方,如图![图片说明](https://img-ask.csdn.net/upload/201905/05/1557026823_184457.jpg) 现在我所想要问的就是,我点击这一条用户信息的确定按钮,要在下方显示的就业信息添加表单里面显示所选的这条基本信息的用户名,如图![图片说明](https://img-ask.csdn.net/upload/201905/05/1557027065_102023.jpg) 我的问题就是不知道怎么传,上面的查询显示信息我是调用的基本信息的那个主页面查询所有的方法 ``` /** * 用户基本信息查询 */ public String infoList() throws Exception { try { if (pageSize == null) { pageSize = 10; } PageUtil pageUtil = new PageUtil(request); pageUtil.setPageSize(pageSize); // 获取分页的参数 totalCount = informationService.getTotalCount(); // 获取分页的参数 pageUtil.setRsCount(totalCount); pageSize = pageUtil.getPageSize(); int pageCount = pageUtil.getPageCount(); int currentPage = pageUtil.getCurrentPage(); // 产生分页的工具条 pageTool = pageUtil.createPageTool(PageUtil.Text); //从基础信息读取所有基础信息 infoList = informationService.getAll(currentPage, pageSize,name); System.out.println(infoList+"##############################################################"); } catch (RuntimeException e) { e.printStackTrace(); } return "infoList"; } ``` 然后项目用的是ssh框架,公司技术比较老,大佬莫笑,页面请求跳转 ``` @ParentPackage(value = "struts-default") @Namespace(value = "/") @Action(value = "employAction", results = { @Result(name = "list", location = "/admin/system/employ/employ_list.jsp"), @Result(name = "add", location = "/admin/system/employ/employ_add.jsp"), @Result(name = "edit", location = "/admin/system/employ/employ_edit.jsp"), @Result(name = "infoList",location = "/admin/system/employ/employ_add.jsp"), }) ``` 然后是action的全部,写的比较乱 ``` package com.gyes.employ.action; import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.jfree.data.DataUtilities; import org.springframework.beans.factory.annotation.Autowired; import com.gyes.currency.util.BaseAction; import com.gyes.currency.util.DateUtil; import com.gyes.currency.util.GsonUtil; import com.gyes.currency.util.JsonUtil; import com.gyes.currency.util.MessageBean; import com.gyes.currency.util.PageUtil; import com.gyes.employ.bean.Employ; import com.gyes.employ.service.EmployService; import com.gyes.system.dept.bean.Dept; import com.gyes.system.dept.service.DeptService; import com.gyes.system.dictionary.bean.Dict; import com.gyes.system.dictionary.serivce.DictService; import com.gyes.system.information.action.InformationAction; import com.gyes.system.information.bean.Information; import com.gyes.system.information.service.InformationService; import com.gyes.system.information.service.impl.InformationServiceImpl; import com.gyes.system.user.bean.User; /** * 部门action * * @author Administrator * */ @ParentPackage(value = "struts-default") @Namespace(value = "/") @Action(value = "employAction", results = { @Result(name = "list", location = "/admin/system/employ/employ_list.jsp"), @Result(name = "add", location = "/admin/system/employ/employ_add.jsp"), @Result(name = "edit", location = "/admin/system/employ/employ_edit.jsp"), @Result(name = "infoList",location = "/admin/system/employ/employ_add.jsp"), }) public class EmployAction extends BaseAction{ @Autowired private EmployService employService; @Autowired private DictService dictService; @Autowired private InformationService informationService; private Employ employ; private String[] ids; private List<Employ> list; private String name; private Information information; //基础信息集合 private List<Information> infoList; private Map<String, Object> map = new HashMap<String, Object>(); // 显示数 private Integer pageSize; private Integer totalCount; private String pageTool; private Integer employId; // 字典中的性别集合 private List<Dict> employwayList; private String informationId; @Override public String execute() throws Exception { return null; } /** * 分页查询所有用户(list) * * @return * @throws Exception */ public String list() throws Exception { try { if (pageSize == null) { pageSize = 10; } PageUtil pageUtil = new PageUtil(request); pageUtil.setPageSize(pageSize); // 获取分页的参数 totalCount = employService.getTotalCount(); // 获取分页的参数 pageUtil.setRsCount(totalCount); pageSize = pageUtil.getPageSize(); int pageCount = pageUtil.getPageCount(); int currentPage = pageUtil.getCurrentPage(); // 产生分页的工具条 pageTool = pageUtil.createPageTool(PageUtil.Text); list = employService.getAll(currentPage, pageSize,name); } catch (RuntimeException e) { e.printStackTrace(); } return "list"; } /** * 增加就业信息 */ public String add() throws Exception { employ = employService.getEmploy(employ); //从数据字典读取就业方式 employwayList=dictService.getDictList("dic_employway"); return "add"; } /** * 用户基本信息查询 */ public String infoList() throws Exception { try { if (pageSize == null) { pageSize = 10; } PageUtil pageUtil = new PageUtil(request); pageUtil.setPageSize(pageSize); // 获取分页的参数 totalCount = informationService.getTotalCount(); // 获取分页的参数 pageUtil.setRsCount(totalCount); pageSize = pageUtil.getPageSize(); int pageCount = pageUtil.getPageCount(); int currentPage = pageUtil.getCurrentPage(); // 产生分页的工具条 pageTool = pageUtil.createPageTool(PageUtil.Text); //从基础信息读取所有基础信息 infoList = informationService.getAll(currentPage, pageSize,name); System.out.println(infoList+"##############################################################"); } catch (RuntimeException e) { e.printStackTrace(); } return "infoList"; } /** * 同一页面传递用户基本信息的姓名 */ public String getInformationName() throws Exception{ Information list=informationService.getById(informationId); System.out.println(list+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"); return list.getInformationname(); } /** * 保存新增内容 * * @return * @throws Exception */ public String save() throws Exception { try { employ.setCrateTime(DateUtil.getSysDateStr()); Dict dic = new Dict(); dic.setDictId(employ.getEmployway_id()); Dict dict = dictService.getById(dic); employ.setEmployway_id(dict.getDictId()); employ.setEmployWay(dict.getValue()); employService.insertEmploy(employ); map.put("success", true); } catch (Exception e) { e.printStackTrace(); map.put("success", false); map.put("message", e.getMessage()); } GsonUtil.writeToResponse(map, false); return NONE; } /** * 进入修改 * * @return */ public String update() throws Exception { employ = employService.getById(employ.getEmployId()); //从数据字典读取就业方式 employwayList=dictService.getDictList("dic_employway"); return "edit"; } /** * 保存修改后数据 * * @return */ public String saveEditEmploy() throws Exception { try { employ.setModifyTime(DateUtil.getSysDateStr()); Dict dic = new Dict(); dic.setDictId(employ.getEmployway_id()); Dict dict = dictService.getById(dic); employ.setEmployway_id(dic.getDictId()); employ.setEmployWay(dict.getValue()); employService.updateEmploy(employ); map.put("success", true); } catch (Exception e) { e.printStackTrace(); map.put("success", false); map.put("message", e.getMessage()); } GsonUtil.writeToResponse(map, false); return NONE; } /** * 判断用户名是否存在 * * @return */ public String AjaxName() throws Exception { MessageBean messageBean = new MessageBean(); messageBean.setFlag(false); List<Information> data = informationService.getInformationList(employ.getEmployName()); if (data.size() > 0) { messageBean.setFlag(true); } PrintWriter out = response.getWriter(); out.print(JsonUtil.objectToJson(messageBean)); return NONE; } /* * 删除部门 */ public String delete() throws Exception { try { employService.deleAbso(ids); map.put("success", true); } catch (Exception e) { e.printStackTrace(); map.put("success", false); map.put("message", e.getMessage()); } GsonUtil.writeToResponse(map, false); return NONE; } public Integer getEmployId() { return employId; } public void setEmployId(Integer employId) { this.employId = employId; } public EmployService getEmployService() { return employService; } public void setEmployService(EmployService employService) { this.employService = employService; } public DictService getDictService() { return dictService; } public void setDictService(DictService dictService) { this.dictService = dictService; } public Employ getEmploy() { return employ; } public void setEmploy(Employ employ) { this.employ = employ; } public List<Employ> getList() { return list; } public void setList(List<Employ> list) { this.list = list; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Map<String, Object> getMap() { return map; } public void setMap(Map<String, Object> map) { this.map = map; } public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } public Integer getTotalCount() { return totalCount; } public void setTotalCount(Integer totalCount) { this.totalCount = totalCount; } public String getPageTool() { return pageTool; } public void setPageTool(String pageTool) { this.pageTool = pageTool; } public String[] getIds() { return ids; } public void setIds(String[] ids) { this.ids = ids; } public List<Dict> getEmploywayList() { return employwayList; } public void setEmploywayList(List<Dict> employwayList) { this.employwayList = employwayList; ``` ``` } public List<Information> getInfoList() { return infoList; } public void setInfoList(List<Information> infoList) { this.infoList = infoList; } public InformationService getInformationService() { return informationService; } public void setInformationService(InformationService informationService) { this.informationService = informationService; } public Information getInformation() { return information; } public void setInformation(Information information) { this.information = information; } } ``` 最后是添加页面的代码 ``` <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>菜单增加</title> <link href="${pageContext.request.contextPath}/admin/css/box_css.css" rel="stylesheet" type="text/css" /> <link href="${pageContext.request.contextPath}/admin/css/content_css.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="${pageContext.request.contextPath}/admin/script/jquery.js"></script> <link rel="stylesheet" href="${pageContext.request.contextPath}/admin/css/common.css" type="text/css"/> <script type="text/javascript" src="${pageContext.request.contextPath}/admin/script/common.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/admin/js/ui.js"></script> <link href="${pageContext.request.contextPath}/admin/css/style.css" rel="stylesheet" /> <script language="javascript"> function checkEmployName(){ var formData = jQuery("#form1").serializeArray(); var saveURL = "<%=path%>/employAction!AjaxName?date="+new Date()+""; jQuery.post(saveURL,formData,function(jsonData){ var message = jsonData.message; var flag = jsonData.flag; if (flag == true){ document.getElementById('employName').value=''; mizhu.alert('', '用户名已经存在,请重新填写!',''); } },"json"); } function save(){ var employName=document.getElementById("employName"); if(employName.value==''){ mizhu.alert('', '用户名称不能为空',''); return false; } var employIndustry=document.getElementById("employIndustry"); if(employIndustry.value==''){ mizhu.alert('', '从事行业不能为空',''); return false; } var employ_workTime=document.getElementById("employ_workTime"); if(employ_workTime.value==''){ mizhu.alert('', '工作年限不能为空',''); return false; }else if(employ_workTime.value>=100){ mizhu.alert('', '工作年限请输入小于100的数字!!!!',''); return false; } var employWay=document.getElementById("employWay"); if(employWay.value==''){ mizhu.alert('', '就业方式必须选择!!!',''); return false; } var eduName=document.getElementById("eduName"); if(eduName.value==''){ mizhu.alert('', '教育机构名称不能为空',''); return false; } var companyName=document.getElementById("companyName"); if(companyName.value==''){ mizhu.alert('', '公司名称不能为空',''); return false; } var formData = jQuery("#form1").serializeArray(); var saveURL = "<%=path%>/employAction!save"; $.ajax({ type:"POST", url:saveURL, data:formData, dataType:"JSON", success:function(obj){ //alert(obj.success); if(obj.success){ $.message("success","新增用户信息成功...."); setTimeout(function(){ location.href="${pageContext.request.contextPath}/employAction!list"; }, 1000); }else{ $.message("error",obj.message); } } }); //不提交表单 return false; } function findOut(){ var name=$("#inputname").val(); var saveURL = "${pageContext.request.contextPath}/employAction!infoList?name="+name+""; if (saveURL!="/employAction!infoList?name=") { window.location.href = saveURL; var ifo=document.getElementById("info"); ifo.style.display="block"; alert(informationname); }else{ } return false; }; function yes(){ var emp=document.getElementById("emp"); emp.style.display="block"; return false; } </script> </head> <body> <div class="main"> <div class="increase_box"> <div class="increase_list"> <h3><b>就业信息管理</b><span></span></h3> <div class="increase_main"> <form id="form1" novalidate="novalidate"> <input type="hidden" id="employId" name="employ.employId" value='<s:property value="employ.employId"/>' /> <input type="hidden" id="informationId" name="information.informationId" value='<s:property value="information.informationId"/>' /> <tr> <td align="left" valin="middle"> <form action="${pageContext.request.contextPath}/employAction!infoList" method="post"> <td align="left" valign="middle" style="text-align:right; width:190px;"></td> <input type="text" class="input_k2" placeholder="请输入用户名" value="" id="inputname" /> </td> <td align="left" valign="middle" style="text-align:right; width:80px;"> <a class="byget" href="javascript:" onclick="findOut()">查询</a></td> </form> </tr> <table width="96%" border="0" align="center" cellpadding="0" cellspacing="0" class="box_news_show assessment_show" style="display: block" id="info"> <tr> <th width="10%" align="center" valign="middle" class="borderright">ID</th> <th width="10%" align="center" valign="middle" class="borderright">姓名</th> <th width="10%" align="center" valign="middle" class="borderright">入伍时间</th> <th width="10%" align="center" valign="middle" class="borderright">退伍时间</th> <th width="10%" align="center" valign="middle" class="borderright">入党时间</th> <th width="20%" align="center" valign="middle" class="borderright">所在单位</th> <th width="10%" align="center" valign="middle" class="borderright">状态</th> <th width="20%" align="center" valign="middle" class="borderright">身份证号码</th> <th align="center" valign="middle" class="borderright">录入人员</th> <th width="5%" align="center" valign="middle">操作</th> </tr> <s:iterator value="infoList" status="st"> <tr onMouseOut="this.style.backgroundColor='#ffffff'" onMouseOver="this.style.backgroundColor='#edf5ff'"> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="informationId"/></td> <td align="center" valign="middle" class="borderright borderbottom" ><s:property value="informationname"/></td> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="enlistmenttime"/></td> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="retiredtime"/></td> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="partytime"/></td> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="unit"/></td> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="stats"/></td> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="numbers"/></td> <td align="center" valign="middle" class="borderright borderbottom"><s:property value="entrypersonnel"/></td> <td><input type="submit" value="确定" class="button_1" onclick="yes()"/></td> </tr> </s:iterator> </table> <table width="96%" border="0" align="center" cellpadding="0" cellspacing="0" class="box_news_show assessment_show" style="display: none" id="emp"> <tr> <td width="20%" class="box_news_show_h3">用户名称: </td> <td width="28%" class="box_news_show_h1"> <input name="information.informaationname" type="text" class="input_k2" onblur="checkEmployName()" maxlength="20" id="infoname"/> <span style="color:red;" id="infoname">*</span> </td> <td width="20%" class="box_news_show_h3">从事行业</td> <td width="28%" class="box_news_show_h1"> <s:textfield name="employ.employIndustry" id="employIndustry" class="input_k2" /> <span style="color:red;" id="employIndustry">*</span> </td> </tr> <tr> <td width="20%" class="box_news_show_h3">工作年限</td> <td width="28%" class="box_news_show_h1"> <s:textfield name="employ.workTime" class="input_k2" id="employ_workTime" onkeyup="this.value=this.value.replace(/\D/g,'')"/>&nbsp;年 <span style="color:red;" id="employ_workTime">*</span> </td> <%-- <td width="20%" class="box_news_show_h3">就业方式</td> <td width="28%" class="box_news_show_h1"> <s:select name="employ.employway_id" list="employwayList" listKey="dictId" listValue="value" id="employWay" headerKey="" headerValue="请选择" class="input_k2"></s:select> <span style="color:red;" id="employ_employWay">*</span> </td> --%> </tr> <tr > <td width="20%" class="box_news_show_h3">培训机构名称</td> <td width="28%" class="box_news_show_h1"> <s:textfield name="employ.eduName" class="input_k2" id="eduName" /> <span style="color:red;" id="employ_eduName">*</span> </td> <td width="20%" class="box_news_show_h3">公司名称</td> <td width="28%" class="box_news_show_h1"> <s:textfield name="employ.companyName" id="companyName" class="input_k2" /> <span style="color:red;" id="employ_companyName">*</span> </td> </tr> </table> </div> </div> <div class="increase_bottom"><p> <input type="button" value="保存" class="button_1" onclick="save()"/> <input type="button" class="button_2" value="返回" onclick="history.go(-1)"/> </p> </div> <div class="clear"></div> </div> </form> </body> </html> ``` 求求各位大佬了,救救孩子吧............................
宿舍管理系统用ajax实现添加和修改,大佬看一下哪错了?
宿舍管理系统修改之后点击保存,页面的数据没有修改成功,但是在前端调试出来的是修改后的值,控制台输出的也是修改后的值,哪位大佬帮忙看一下哪错了? ``` <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <script src="${pageContext.request.contextPath}/bootstrap/js/jQuery.js"></script> <script type="text/javascript"> $(document).ready(function(){ $("ul li:eq(1)").addClass("active"); }); </script> <script type="text/javascript"> //添加 function add() { //获取表单中输入的值 var uName = $("#userName").val(); var uPass = $("#password").val(); var name = $("#name").val(); var sex = $("#sex").val(); var tel = $("#tel").val(); var dormManagerId = $("#dormManagerId").val(); //alert(uName + " " + uPass + " " + name+" "+sex + " " + tel+" "+dormManagerId ); $.ajax({ type : "POST", url : "dormManager", data : { action:"add", userName : uName, password : uPass, name : name, sex : sex, tel : tel }, success : function(x) { var json = eval("(" + x + ")"); if (json.status == 0) { alert(json.msg); } else if (json.status == 1) { location.href = "mainAdmin.jsp"; } } }) } function update(){ //获取表单中输入的值 var uName = $("#userName").val(); var uPass = $("#password").val(); var name = $("#name").val(); var sex = $("#sex").val(); var tel = $("#tel").val(); var dormManagerId = $("#dormManagerId").val(); $.ajax({ type : "POST", url : "dormManager", data : { action:"update", userName : uName, password : uPass, name : name, sex : sex, tel : tel, dormManagerId : dormManagerId }, success : function(x) { var json = eval("(" + x + ")"); if (json.status == 0) { alert(json.msg); } else if (json.status == 1) { location.href = "mainAdmin.jsp"; } } }) } </script> <div class="data_list"> <div class="data_list_title"> <c:choose> <c:when test="${dormManager.dormManagerId!=null }"> 修改管理员 </c:when> <c:otherwise> 添加管理员 </c:otherwise> </c:choose> </div> <form action="dormManager?action=save" method="post" onsubmit="return checkForm()"> <div class="data_form" > <input type="hidden" id="dormManagerId" name="dormManagerId" value="${dormManager.dormManagerId }"/> <table align="center"> <tr> <td><font color="red">*</font>用户名:</td> <td><input type="text" id="userName" name="userName" value="${dormManager.userName }" style="margin-top:5px;height:30px;" /></td> </tr> <tr> <td><font color="red">*</font>密码:</td> <td><input type="password" id="password" name="password" value="${dormManager.password }" style="margin-top:5px;height:30px;" /></td> </tr> <tr> <td><font color="red">*</font>重复密码:</td> <td><input type="password" id="rPassword" name="rPassword" value="${dormManager.password }" style="margin-top:5px;height:30px;" /></td> </tr> <tr> <td><font color="red">*</font>姓名:</td> <td><input type="text" id="name" name="name" value="${dormManager.name }" style="margin-top:5px;height:30px;" /></td> </tr> <tr> <td><font color="red">*</font>性别:</td> <td> <select id="sex" name="sex" style="width: 90px;"> <option value="">请选择...</option> <option value="男" ${dormManager.sex eq "男"?'selected':'' }>男</option> <option value="女" ${dormManager.sex eq "女"?'selected':'' }>女</option> </select> </td> </tr> <tr> <td><font color="red">*</font>联系电话:</td> <td><input type="text" id="tel" name="tel" value="${dormManager.tel }" style="margin-top:5px;height:30px;" /></td> </tr> </table> <div align="center"> <button type="button" onclick="add()" class="btn btn-primary" />保存 &nbsp; <button class="btn btn-primary" type="button" onclick="javascript:history.back()">返回</button> </div> <div align="center"> <font id="error" color="red">${error }</font> </div> </div> </form> </div> ```
opencv svm detector该怎么写?
我用64*128的图片,hog特征+svm可以成功检测出行人。但是换成64*64尺寸的图片,可以训练出svm模型,但是检测时会出错,觉得应该是detector的问题,但是不知道该怎么重写? 对提取好的HogFeatureMat进行pca降维后检测同样会出现类似的错误。detector该怎么重写,里面哪些参数需要调整?谢谢。代码如下 ``` #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/ml/ml.hpp> using namespace std; using namespace cv; #define PosSamNO 1114 //正样本个数 #define NegSamNO 12180 //负样本个数 #define TRAIN false//是否进行训练,true表示重新训练,false表示读取xml文件中的SVM模型 #define CENTRAL_CROP false //true:训练时,对96*160的INRIA正样本图片剪裁出中间的64*128大小人体 //HardExample:负样本个数。如果HardExampleNO大于0,表示处理完初始负样本集后,继续处理HardExample负样本集。 //不使用HardExample时必须设置为0,因为特征向量矩阵和特征类别矩阵的维数初始化时用到这个值 #define HardExampleNO 433 //继承自CvSVM的类,因为生成setSVMDetector()中用到的检测子参数时,需要用到训练好的SVM的decision_func参数, //但通过查看CvSVM源码可知decision_func参数是protected类型变量,无法直接访问到,只能继承之后通过函数访问 class MySVM : public CvSVM { public: //获得SVM的决策函数中的alpha数组 double * get_alpha_vector() { return this->decision_func->alpha; } //获得SVM的决策函数中的rho参数,即偏移量 float get_rho() { return this->decision_func->rho; } }; int main() { //检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9 HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG检测器,用来计算HOG描述子的 int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定 MySVM svm;//SVM分类器 //若TRAIN为true,重新训练分类器 if(TRAIN) { string ImgName;//图片名(绝对路径) ifstream finPos("d:/hogmit/pos/pos.txt");//正样本图片的文件名列表 //ifstream finPos("PersonFromVOC2012List.txt");//正样本图片的文件名列表 ifstream finNeg("d:/hogmit/neg/neg.txt");//负样本图片的文件名列表 Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数 Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人 //依次读取正样本图片,生成HOG描述子 for(int num=0; num<PosSamNO && getline(finPos,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; //ImgName = "D:\\DataSet\\PersonFromVOC2012\\" + ImgName;//加上正样本的路径名 ImgName = "d:/hogmit/pos/" + ImgName;//加上正样本的路径名 Mat src = imread(ImgName);//读取图片 if(CENTRAL_CROP) src = src(Rect(16,16,64,128));//将96*160的INRIA正样本图片剪裁为64*128,即剪去上下左右各16个像素 //resize(src,src,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) // cout<<"描述子维数:"<<descriptors.size()<<endl; //处理第一个样本时初始化特征向量矩阵和类别矩阵,因为只有知道了特征向量的维数才能初始化特征向量矩阵 if( 0 == num ) { DescriptorDim = descriptors.size();//HOG描述子的维数 //初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMat sampleFeatureMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, DescriptorDim, CV_32FC1); //初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人 sampleLabelMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, 1, CV_32FC1); } //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num,i) = descriptors[i];//第num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num,0) = 1;//正样本类别为1,有人 } //依次读取负样本图片,生成HOG描述子 for(int num=0; num<NegSamNO && getline(finNeg,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/neg/" + ImgName;//加上负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO,0) = -1;//负样本类别为-1,无人 } //处理HardExample负样本 if(HardExampleNO > 0) { ifstream finHardExample("d:/hogmit/hard/hard.txt");//HardExample负样本的文件名列表 //依次读取HardExample负样本图片,生成HOG描述子 for(int num=0; num<HardExampleNO && getline(finHardExample,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/hard/" + ImgName;//加上HardExample负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO+NegSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO+NegSamNO,0) = -1;//负样本类别为-1,无人 } } //输出样本的HOG特征向量矩阵到文件 ofstream fout("d:/hogmit/SampleFeatureMat.txt"); for(int i=0; i<PosSamNO+NegSamNO; i++) { fout<<i<<endl; for(int j=0; j<DescriptorDim; j++) { fout<<sampleFeatureMat.at<float>(i,j)<<" "; } fout<<endl; } //训练SVM分类器 //迭代终止条件,当迭代满1000次或误差小于FLT_EPSILON时停止迭代 CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON); //SVM参数:SVM类型为C_SVC;线性核函数;松弛因子C=0.01 CvSVMParams param(CvSVM::C_SVC, CvSVM::LINEAR, 0, 1, 0, 0.01, 0, 0, 0, criteria); cout<<"开始训练SVM分类器"<<endl; svm.train(sampleFeatureMat,sampleLabelMat, Mat(), Mat(), param);//训练分类器 cout<<"训练完成"<<endl; svm.save("d:/hogmit/SVM_HOG_mit_inria(1114pos+12180neg+433hard).xml");//将训练好的SVM模型保存为xml文件 } else //若TRAIN为false,从XML文件读取训练好的分类器 { cout<<"fail train"<<endl; //svm.load("SVM_HOG_2400PosINRIA_12000Neg_HardExample(误报少了漏检多了).xml");//从XML文件读取训练好的SVM模型 svm.load("d:/hogmit/SVM_HOG_2400PosINRIA_12000Neg_HardExample(误报少了漏检多了).xml"); } /************************************************************************************************* 线性SVM训练完成后得到的XML文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho; 将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。 如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), 就可以利用你的训练样本训练出来的分类器进行行人检测了。 ***************************************************************************************************/ DescriptorDim = svm.get_var_count();//特征向量的维数,即HOG描述子的维数 int supportVectorNum = svm.get_support_vector_count();//支持向量的个数 cout<<"支持向量个数:"<<supportVectorNum<<endl; Mat alphaMat = Mat::zeros(1, supportVectorNum, CV_32FC1);//alpha向量,长度等于支持向量个数 Mat supportVectorMat = Mat::zeros(supportVectorNum, DescriptorDim, CV_32FC1);//支持向量矩阵 Mat resultMat = Mat::zeros(1, DescriptorDim, CV_32FC1);//alpha向量乘以支持向量矩阵的结果 //将支持向量的数据复制到supportVectorMat矩阵中 for(int i=0; i<supportVectorNum; i++) { const float * pSVData = svm.get_support_vector(i);//返回第i个支持向量的数据指针 for(int j=0; j<DescriptorDim; j++) { //cout<<pData[j]<<" "; supportVectorMat.at<float>(i,j) = pSVData[j]; } } //将alpha向量的数据复制到alphaMat中 double * pAlphaData = svm.get_alpha_vector();//返回SVM的决策函数中的alpha向量 for(int i=0; i<supportVectorNum; i++) { alphaMat.at<float>(0,i) = pAlphaData[i]; } //计算-(alphaMat * supportVectorMat),结果放到resultMat中 //gemm(alphaMat, supportVectorMat, -1, 0, 1, resultMat);//不知道为什么加负号? resultMat = -1 * alphaMat * supportVectorMat; //得到最终的setSVMDetector(const vector<float>& detector)参数中可用的检测子 vector<float> myDetector; //将resultMat中的数据复制到数组myDetector中 for(int i=0; i<DescriptorDim; i++) { myDetector.push_back(resultMat.at<float>(0,i)); } //最后添加偏移量rho,得到检测子 myDetector.push_back(svm.get_rho()); cout<<"检测子维数:"<<myDetector.size()<<endl; //设置HOGDescriptor的检测子 HOGDescriptor myHOG; myHOG.setSVMDetector(myDetector); //myHOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //保存检测子参数到文件 ofstream fout("d:/hogmit/HOGDetectorForOpenCV.txt"); for(int i=0; i<myDetector.size(); i++) { fout<<myDetector[i]<<endl; } /**************读入图片进行HOG行人检测******************/ Mat src = imread("d:/hogmit/无标题.png"); //Mat src = imread("2007_000423.jpg"); //Mat src = imread("1.png"); vector<Rect> found, found_filtered;//矩形框数组 cout<<"进行多尺度HOG人体检测"<<endl; myHOG.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图片进行多尺度行人检测 //src为输入待检测的图片;found为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离; //参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即测试图片每次尺寸缩放增加的比例; //参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。 cout<<"找到的矩形框个数:"<<found.size()<<endl; //找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中 for(int i=0; i < found.size(); i++) { Rect r = found[i]; int j=0; for(; j < found.size(); j++) if(j != i && (r & found[j]) == r) break; if( j == found.size()) found_filtered.push_back(r); } //画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整 for(int i=0; i<found_filtered.size(); i++) { Rect r = found_filtered[i]; r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3); } imwrite("d:/hogmit/ImgProcessed3.jpg",src); namedWindow("src",0); imshow("src",src); waitKey();//注意:imshow之后必须加waitKey,否则无法显示图像 /******************读入单个64*128的测试图并对其HOG描述子进行分类*********************/ ////读取测试图片(64*128大小),并计算其HOG描述子 //Mat testImg = imread("person014142.jpg"); //Mat testImg = imread("noperson000026.jpg"); //vector<float> descriptor; //hog.compute(testImg,descriptor,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //Mat testFeatureMat = Mat::zeros(1,3780,CV_32FC1);//测试样本的特征向量矩阵 //将计算好的HOG描述子复制到testFeatureMat矩阵中 //for(int i=0; i<descriptor.size(); i++) // testFeatureMat.at<float>(0,i) = descriptor[i]; //用训练好的SVM分类器对测试图片的特征向量进行分类 //int result = svm.predict(testFeatureMat);//返回类标 //cout<<"分类结果:"<<result<<endl; system("pause"); } ```
style未定义!!!!!!!!!!!
<%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="ctx" value="${pageContext.request.contextPath}"/> <!DOCTYPE HTML> <html> <head> <jsp:include page="/WEB-INF/jsp/web/common.jsp"/> <title>用户管理</title> </head> <body> <nav class="breadcrumb"><i class="Hui-iconfont">&#xe67f;</i> 首页 <span class="c-gray en">&gt;</span> 系统管理 <span class="c-gray en">&gt;</span> 用户管理 <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新" id="refresh"><i class="Hui-iconfont">&#xe68f;</i></a> </nav> <div class="page-container"> <div class="text-c"> <button onclick="removeIframe()" class="btn btn-primary radius">关闭选项卡</button> <span class="select-box inline"> <select class="select" id="sel_Sub" name="uuid" onchange=""> <c:forEach items="${cList}" var="item"> <option value="${item.id}">${item.user_name}</option> </c:forEach> </select> </span> <input type="text" name="" id="search-name" placeholder="用户名称、id" style="width:250px" class="input-text"> <button name="" id="search" class="btn btn-success" onclick="search();"><i class="Hui-iconfont">&#xe665;</i> 搜索 </button> </div> <div class="cl pd-5 bg-1 bk-gray mt-20"> <span class="l"> <a href="javascript:" onclick="datadel()" class="btn btn-danger radius"><i class="Hui-iconfont">&#xe6e2;</i> 批量删除</a> <a class="btn btn-primary radius" onclick="system_user_add('添加用户','${ctx}/system/system-user-add')" href="javascript:"><i class="Hui-iconfont">&#xe600;</i> 添加用户</a> </span> <!--<span class="r">共有数据:<strong>54</strong> 条</span>--> </div> <div class="mt-20"> <table class="table table-border table-bordered table-hover table-bg table-sort"> <thead> <tr class="text-c"> <th width="25"><input type="checkbox" name="" value=""></th> <th width="20">用户名称</th> <th width="80">手机号</th> <th width="80">邮箱</th> <th width="20">操作</th> </tr> </thead> <tbody></tbody> </table> </div> </div> <jsp:include page="/WEB-INF/jsp/web/footer.jsp"/> <script type="text/javascript" src="${ctx}/lib/My97DatePicker/4.8/WdatePicker.js"></script> <script type="text/javascript" src="${ctx}/lib/datatables/1.10.0/jquery.dataTables.min.js"></script> <script type="text/javascript" src="${ctx}/lib/laypage/1.2/laypage.js"></script> <script type="text/javascript"> var dataTable = $('.table-sort').dataTable({ "aaSorting": [[1, "desc"]],//默认第几个排序 "bStateSave": true,//状态保存 "searching": false, //开启搜索标志 "bProcessing": true, "aoColumnDefs": [ //{"bVisible": false, "aTargets": [ 3 ]} //控制列的隐藏显示 {"orderable": false, "aTargets": [0, 1, 3, 4, 5]}// 制定列不参与排序 ], "serverSide": true,//服务器分页标志 //ajax地址 "sAjaxSource": "${ctx}/system/system-user-list/json.dt",// action地址 "fnServerData": retrieveData,//执行方法 "fnRowCallback": retrieveColumnData,//返回数据重构 "fnServerParams": function (aoData) { aoData.push( {"name": "search", "value": $('#search-name').val()}, {"name": "uuid", "value": $('#sel_Sub').val()} ) }, //配置列要显示的数据 "columns": [ {"data": null}, {"data": "USER_NAME"}, {"data": "MOBILE"}, {"data": "EMAIL"}, {"data": null} ] }); function retrieveColumnData(nRow, aData, iDisplayIndex) { $('td:eq(0)', nRow).html('&nbsp;<input type="checkbox" value="" name="">'); var last = "<a title=\"编辑\" href=\"javascript:\"\n" + " onclick=\"system_user_edit('用户编辑','${ctx}/system/system-user-add','" + aData.UUID + "')\"\n" + " style=\"text-decoration:none\"><i class=\"Hui-iconfont\">&#xe6df;</i></a>\n" + " <a title=\"删除\" href=\"javascript:\" onclick=\"system_user_del(this,'" + aData.UUID + "')\" class=\"ml-5\"\n" + " style=\"text-decoration:none\"><i class=\"Hui-iconfont\">&#xe6e2;</i></a>"; $('td:last', nRow).html(last); $('td:last', nRow).addClass('f-14'); $(nRow).addClass('text-c'); return nRow; } function retrieveData(sSource, aoData, fnCallback) { /* post 方法调用*/ $.ajax({ "type": "post", "contentType": "application/json", "cache": false, //禁用缓存 "url": sSource, "dataType": "json", "data": JSON.stringify(aoData), "success": function (resp) { fnCallback(resp); //服务器端返回的对象的returnObject部分是要求的格式 } }); } /*系统-用户-添加*/ function system_user_add(title, url, w, h) { layer_show(title, url, w, h); } /*系统-用户-编辑*/ function system_user_edit(title, url, id, w, h) { layer_show(title, url + '?id=' + id, w, h); } /*系统-用户-删除*/ function system_user_del(obj, id) { layer.confirm('确认要删除吗?', function (index) { $.ajax({ type: 'POST', url: '', dataType: 'json', success: function (data) { $(obj).parents("tr").remove(); layer.msg('已删除!', {icon: 1, time: 1000}); }, error: function (data) { console.log(data.msg); }, }); }); } function search() { dataTable.fnDraw(); } </script> </body> </html>
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
阿里P8数据架构师:顶级开发者都在用什么数据库?
其实从去年已经隐隐约约感觉到数据库的有变化,只是没有想到变得这么快。今年的一些事情实实在在地给了某些数据库重击,如果以前去某数据库还是喊喊,然后该用还用,今年从传统领域刮起的去某数据库的风,已经开始了,并且后面的乌云密布也看得见。 最近看一篇国外的开源产品提供厂商的一篇文字,主要是在询问了他的几百位客户后得出了下图中的2019年数据库的使用趋势。 从图中可以看出,MySQL以38.9...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
互联网公司分布式系统架构演进之路
介绍 分布式和集群的概念经常被搞混,现在一句话让你明白两者的区别。 分布式:一个业务拆分成多个子业务,部署在不同的服务器上 集群:同一个业务,部署在多个服务器上 例如:电商系统可以拆分成商品,订单,用户等子系统。这就是分布式,而为了应对并发,同时部署好几个用户系统,这就是集群 1 单应用架构 2 应用服务器和数据库服务器分离 单机负载越来越来,所以要将应用服务器和数据库服务器分离 3 应用服务...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
程序员需要了解的硬核知识之汇编语言(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语...
OpenCV-Python 绘图功能 | 七
目标 学习使用OpenCV绘制不同的几何形状 您将学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等。 代码 在上述所有功能中,您将看到一些常见的参数,如下所示: img:您要绘制形状的图像 color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)对于蓝色。对于灰度,只需传递...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Fiddler+夜神模拟器进行APP抓包
Fiddler+夜神模拟器进行APP抓包 作者:霞落满天 需求:对公司APP进行抓包获取详细的接口信息,这是现在开发必备的。 工具:Fiddler抓包,夜神模拟器 模拟手机 安装APP 1.下载Fiddler https://www.telerik.com/download/fiddler Fiddler正是在这里帮助您记录计算机和Internet之间传递的所有HTTP和HTTPS通信...
小白学 Python 爬虫(42):春节去哪里玩(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
一文带你看清 HTTP 所有概念
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层) HTTP 标头 先来回顾一下 HTTP1.1 标头都有哪几种 HTTP 1.1 的标头主要分为四种,通用标头、实体标头、请求标头、响应标头,现在我们来对这几种标头进行介绍 通用...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
[数据结构与算法] 排序算法之归并排序与基数排序
归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 基本思想 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
史上最牛逼的 Eclipse 快捷键,提高开发效率!
如果你在使用IDEA,请参考博主另外的一篇idea快捷键的博客。
如何快速打好Java基础?
二哥,我是一名大学生,专业是电力工程,但想自学 Java,如何快速打好基础呢? 微信上 tison 向我提出了这个问题。我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多个年头了,真的是从一名编程白痴一步步走到现在的。 我在各大技术网站上分享了不少 Java 方面的原创文章,不知道影响了多少初学者,反正文章的留言中经常能看到他们由衷的感谢。现在每天仍然有不少同学(...
在三线城市工作爽吗?
我是一名程序员,从正值青春年华的 24 岁回到三线城市洛阳工作,至今已经 6 年有余。一不小心又暴露了自己的实际年龄,但老读者都知道,我驻颜有术,上次去看房子,业务员肯定地说:“小哥肯定比我小,我今年还不到 24。”我只好强颜欢笑:“你说得对。” 从我拥有记忆到现在进入而立之年,我觉得,我做过最明智的选择有下面三个: 1)高中三年,和一位女同学保持着算不上朋友的冷淡关系;大学半年,把这位女同学追到...
相关热词 c#时间格式化 不带- c#替换字符串中指定位置 c# rdlc 动态报表 c# 获取txt编码格式 c#事件主动调用 c#抽象工厂模式 c# 如何添加类注释 c# static块 c#处理浮点数 c# 生成字母数字随机数
立即提问