精华内容
下载资源
问答
  • 在使用flowable 创建初始化oracle数据,出现如下错误: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLException: ORA-00942: 或视图不存在 ### ...

    在使用flowable 创建初始化oracle数据表,出现如下错误:

     

    
    org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: java.sql.SQLException: ORA-00942: 表或视图不存在
    ### The error may exist in org/flowable/db/mapping/entity/Property.xml
    ### The error may involve org.flowable.engine.impl.persistence.entity.PropertyEntityImpl.selectProperty-Inline
    ### The error occurred while setting parameters
    ### SQL: select * from ACT_GE_PROPERTY where NAME_ = ?
    ### Cause: java.sql.SQLException: ORA-00942: 表或视图不存在
    	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
    	at org.flowable.engine.common.impl.db.DbSqlSession.selectById(DbSqlSession.java:237)
    	at org.flowable.engine.common.impl.db.DbSqlSession.selectById(DbSqlSession.java:2
    

    初始化配置如下:

    ProcessEngineConfiguration pec = new StandaloneProcessEngineConfiguration();
    pec.setJdbcDriver("oracle.jdbc.driver.OracleDriver");
    pec.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl");
    pec.setJdbcUsername("flowable");
    pec.setJdbcPassword("flowable");
    pec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    ProcessEngine processEngine = pec.buildProcessEngine();
    

     

    可能是以前另一个数据库用户初始化过Flowable数据库表的原因,于是添加Shema配置

    pec.setDatabaseSchema("FLOWABLE");
    添加配置后,重新启动初始化,又出现了错误,错误信息如下:
    
    java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.setSchema(Ljava/lang/String;)V
     
    	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.apache.ibatis.datasource.pooled.PooledConnection.invoke(PooledConnection.java:245)
    	at com.sun.proxy.$Proxy6.setSchema(Unknown Source)
    	at org.flowable.engine.common.impl.db.DbSqlSessionFactory.openSession(DbSqlSessionFactory.java:78)
    	at org.flowable.engine.common.impl.interceptor.CommandContext.getSession(CommandContext.java:243)
    	at org.flowable.engine.common.impl.cfg.standalone.StandaloneMybatisTransactionContext.<init>(StandaloneMybatisTransactionContext.java:48)
    	at org.flowable.engine.common.impl.cfg.standalone.StandaloneMybatisTransactionContextFactory.openTransactionContext(StandaloneMybatisTransactionContextFactory.java:26)
    	at org.flowable.engine.common.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:47)
    	at org.flowable.engine.common.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:72)
    	at org.flowable.engine.common.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:35)
    	at org.flowable.engine.common.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56)
    	at org.flowable.idm.engine.impl.IdmEngineImpl.<init>(IdmEngineImpl.java:45)
    	at org.flowable.idm.engine.IdmEngineConfiguration.buildIdmEngine(IdmEngineConfiguration.java:171)
    	at org.flowable.engine.impl.cfg.IdmEngineConfigurator.configure(IdmEngineConfigurator.java:76)
    	at org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl.configuratorsAfterInit(ProcessEngineConfigurationImpl.java:1375)
    	at org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl.init(ProcessEngineConfigurationImpl.java:865)
    	at org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:779)
    	at com.smart.HolidayTest.engineTest(HolidayTest.java:26)
    	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.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    	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.junit.runners.ParentRunner.run(ParentRunner.java:363)
    	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
    	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    	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
    

    解决办法:

    去掉schema配置,设置一个表前缀

    ProcessEngineConfiguration pec = new StandaloneProcessEngineConfiguration();
            pec.setJdbcDriver("oracle.jdbc.driver.OracleDriver");
            pec.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl");
            pec.setJdbcUsername("flowable");
            pec.setJdbcPassword("flowable");
     
            pec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
     
            //pec.setDatabaseSchema("FLOWABLE");
            pec.setDatabaseTablePrefix("flow");
            ProcessEngine processEngine = pec.buildProcessEngine();
    

    再执行自动建表,发现所有表和序列都已经创建成功。

    然后就可以愉快地玩耍了。

    展开全文
  • 声明:详细数据转载自 https://blog.csdn.net/hj7jay/article/details/51302829 ...初始化activit5框架的 执行测试类里的createTables方法 package com.lpinfo.activiti.test; import org.activiti.e...

    声明:表详细数据转载自 https://blog.csdn.net/hj7jay/article/details/51302829

    该博主对activiti数据模型做了很深的讲解

    一.框架结构

    二.初始化activit5框架的表 执行测试类里的createTables方法

    package com.lpinfo.activiti.test;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngineConfiguration;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.repository.Deployment;
    import org.junit.Test;
    
    public class ActivitiTest {
    	
    	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
    	@Test
    	public void createTables(){
    		ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
    		processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
    		processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/lpinfo-activiti?useUnicode=true&amp;characterEncoding=utf8");
    		processEngineConfiguration.setJdbcUsername("root");
    		processEngineConfiguration.setJdbcPassword("root");
    		processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP);
    		processEngineConfiguration.buildProcessEngine();
    	}
    	/**
    	 * ===配置 细信息
    	 * getRepositoryService() //与流程定义和部署对象相关的Service
    	 * createDeployment()  //创建一个部署对象
    	 * name("helloworld入门程序")  //添加部署的名称
    	 * addClasspathResource("diagrams/helloworld.bpmn") //从classpath的资源中加载,一次只能加载一个文件
    	 * addClasspathResource("diagrams/helloworld.png") //从classpath的资源中加载,一次只能加载一个文件
    	 * deploy() //完成部署
    	 * ===操作的表
    	 *  
    	 * 
    	 */
    	@Test
    	public void deploymentProcessDefinition(){
    		Deployment deployment = processEngine.getRepositoryService()
    						.createDeployment()
    						.name("helloworld入门程序")
    						.category("helloword")
    						.addClasspathResource("diagrams/helloworld.bpmn")
    						.addClasspathResource("diagrams/helloworld.png")
    						.deploy();//完成部署
    		System.out.println("部署ID:"+deployment.getId());
    		System.out.println("部署类别:"+deployment.getCategory());
    		System.out.println("部署名称:"+deployment.getName());
    	}
    	
    	
    }
    

    三.框架表讲解

    1.框架表截图

    2.相关表讲解 

       Activiti工作流总共包含23张数据表,所有的表名默认以“ACT_”开头。

    并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配。

    u  ACT_GE_* : “GE”代表“General”(通用),用在各种情况下;

    u  ACT_HI_* : “HI”代表“History”(历史),这些表中保存的都是历史数据,比如执行过的流程实例、变量、任务,等等。Activit默认提供了4种历史级别:

    Ø  none: 不保存任何历史记录,可以提高系统性能;

    Ø  activity:保存所有的流程实例、任务、活动信息;

    Ø  audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;

    Ø  full:最完整的历史记录,除了包含audit级别的信息之外还能保存详细,例如:流程变量。

    对于几种级别根据对功能的要求选择,如果需要日后跟踪详细可以开启full。

    u  ACT_ID_* : “ID”代表“Identity”(身份),这些表中保存的都是身份信息,如用户和组以及两者之间的关系。如果Activiti被集成在某一系统当中的话,这些表可以不用,可以直接使用现有系统中的用户或组信息;

    u  ACT_RE_* : “RE”代表“Repository”(仓库),这些表中保存一些‘静态’信息,如流程定义和流程资源(如图片、规则等);

    u  ACT_RU_* : “RU”代表“Runtime”(运行时),这些表中保存一些流程实例、用户任务、变量等的运行时数据。Activiti只保存流程实例在执行过程中的运行时数据,并且当流程结束后会立即移除这些数据,这是为了保证运行时表尽量的小并运行的足够快;
     

    表名称描述
    一般 数据

    ACT_GE_BYTEARRAY

    通用的流程定义和流程资源 

    ACT_GE_PROPERTY

    系统相关属性 

       
    流程定义

    ACT_RE_DEPLOYMENT

    部署单元信息

    ACT_RE_MODEL

    模型信息

    ACT_RE_PROCDEF

    已部署的流程定义

       
    运行实例

    ACT_RU_EVENT_SUBSCR

    运行时事件

    ACT_RU_EXECUTION

    运行时流程执行实例

    ACT_RU_IDENTITYLINK

    运行时用户关系信息

    ACT_RU_JOB

    运行时作业

    ACT_RU_TASK

    运行时任务

    ACT_RU_VARIABLE

    运行时变量表

       
    组用户

    ACT_ID_GROUP

    身份信息-组信息

    ACT_ID_INFO

    身份信息-组信息

    ACT_ID_MEMBERSHIP

    身份信息-用户和组关系的中间表

    ACT_ID_USER

    身份信息-用户信息

       
    历史记录

    ACT_HI_ACTINST

    历史的流程实例

    ACT_HI_ATTACHMENT

    历史的流程附件

    ACT_HI_COMMENT

    历史的说明性信息

    ACT_HI_DETAIL

    历史的流程运行中的细节信息

    ACT_HI_IDENTITYLINK

    历史的流程运行过程中用户关系

    ACT_HI_PROCINST

    历史的流程实例

    ACT_HI_TASKINST

    历史的任务实例

    ACT_HI_VARINST

    历史的流程运行中的变量信息

       

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3.各自表讲解

    2  Activiti中主要对象的关系
    本节主要介绍在工作流中出现的几个对象及其之间的关系,以及在Activiti中各个对象是如何关联的。

    在开始之前先看看下图,对整个对象结构有个了解,再结合实例详细介绍理解。

    图1.Activiti中几个对象之间的关系

    我们模拟一个请假的流程进行分析介绍,该流程主要包含以下几个步骤:

    u  员工申请请假

    u  部门领导审批

    u  人事审批

    u  员工销假

     

    ProcessInstance对象

    员工开始申请请假流程,通过runtimeService.startProcessInstance()方法启动,引擎会创建一个流程实例(ProcessInstance)。

    简单来说流程实例就是根据一次(一条)业务数据用流程驱动的入口,两者之间是一对一的关系。流程引擎会创建一条数据到ACT_RU_EXECUTION表,同时也会根据history的级别决定是否查询相同的历史数据到ACT_HI_PROCINST表。

    启动完流程之后业务和流程已经建立了关联关系,第一步结束。

    启动流程和业务关联区别:

    u 对于自定义表单来说启动的时候会传入businessKey作为业务和流程的关联属性

    u 对于动态表单来说不需要使用businessKey关联,因为所有的数据都保存在引擎的表中

    u 对于外部表单来说businessKey是可选的,但是一般不会为空,和自定义表单类似

     

    Execution对象

    对于初学者来说,最难理解的地方就是ProcessInstance与Execution之间的关系,要分两种情况说明。Execution的含义就是一个流程实例(ProcessInstance)具体要执行的过程对象。

    不过在说明之前先声明两者的对象映射关系:

    ProcessInstance(1)→ Execution(N),(其中N>=1)。

    1)  值相等的情况:

    除了在流程中启动的子流程之外,流程启动之后在表ACT_RU_EXECUTION中的字段ID_和PROC_INST_ID_字段值是相同的。

    图2.ID_和PROC_INST_ID_相等

    2)  值不相等的情况:

    不相等的情况目前只会出现在子流程中(包含:嵌套、引入),例如一个购物流程中除了下单、出库节点之外可能还有一个付款子流程,在实际企业应用中付款流程通常是作为公用的,所以使用子流程作为主流程(购物流程)的一部分。

    当任务到达子流程时引擎会自动创建一个付款流程,但是这个流程有一个特殊的地方,在数据库可以直观体现,如下图。

    图3.ID_和PROC_INST_ID_不相等

    上图中有两条数据,第二条数据(嵌入的子流程)的PARENT_ID_等于第一条数据的ID_和PROC_INST_ID_,并且两条数据的PROC_INST_ID_相同。

    上图中还有一点特殊的地方,字段IS_ACTIVE_的值分别是0和1,说明正在执行子流程主流程挂起。

     

    Task对象

    前面说了ProcessInstance和业务是一对一关联的,和业务数据最亲密;而Task则和用户最亲密的(UserTask),用户每天的待办事项就是一个个的Task对象。

    从图1中看得出Execution和Task是一对一关系,Task可以是任何类型的Task实现,可以是用户任务(UserTask)、Java服务(JavaServiceTask)等,在实际流程运行中只不过面向对象不同,用户任务(UserTask)需要有人为参与完成(complete),Java服务需要由系统自动执行(execution)。

    图4. 表ACT_RU_TASK

    Task是在流程定义中看到的最大单位,每当一个Task完成的时候引擎会把当前的任务移动到历史中,然后插入下一个任务插入到表ACT_RU_TASK中。结合请假流程来说就是让用户点击“完成”按钮提交当前任务是的动作,引擎自动根据任务的顺序流或者排他分支判断走向。

     

    HistoryActivity(历史活动)

    图5. 表ACT_HI_ACTINST

     

    Activity包含了流程中所有的活动数据,例如开始事件(图5表中的第1条数据)、各种分支(排他分支、并行分支等,图5表中的第2条数据)、以及刚刚提到的Task执行记录(如图5表中的第3、4条数据)。

    有些人认为Activity和Task是多对一关系,其实不是,从上图中可以看出来根本没有Task相关的字段。

    结合请假流程来说,如Task中提到的当完成流程的时候所有下一步要执行的任务(包括各种分支)都会创建一个Activity记录到数据库中。例如领导审核节点点击“同意”按钮就会流转到人事审批节点,如果“驳回”那就流转到调整请假内容节点,每一次操作的Task背后实际记录更详细的活动(Activity)。
     

    展开全文
  • servlet 配置信息初始化参数

    千次阅读 2016-09-11 22:21:30
    Servlet取得初始化配置信息:   通过config对象可以读取web.xml中的配置的初始化参数,此对象实际上是ServletConfig借口的实例。可以通过init()方法找到ServletConfig接口实例。   读取初始化配置信息------...

    Servlet取得初始化配置信息:

     

    通过config对象可以读取web.xml中的配置的初始化参数,此对象实际上是ServletConfig借口的实例。可以通过init()方法找到ServletConfig接口实例。

     

    读取初始化配置信息------InitParamServlet.Java

    [java]  view plain  copy
    1. package com.ls.servlet_01;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.PrintWriter;  
    5.   
    6. import javax.servlet.ServletConfig;  
    7. import javax.servlet.ServletException;  
    8. import javax.servlet.http.HttpServlet;  
    9. import javax.servlet.http.HttpServletRequest;  
    10. import javax.servlet.http.HttpServletResponse;  
    11.   
    12. public class InitParamServlet extends HttpServlet {  
    13.   
    14.     String initParam=null;  
    15.     public void init(ServletConfig config) throws ServletException {  
    16.         this.initParam=config.getInitParameter("ref");  
    17.     }  
    18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
    19.             throws ServletException, IOException {  
    20.         System.out.println("初始化参数:"+this.initParam);  
    21.           
    22.     }  
    23.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    24.             throws ServletException, IOException {  
    25.         this.doGet(request, response);  
    26.     }  
    27. }  

    在web.xml中配置初始化信息

    [java]  view plain  copy
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7. <servlet>  
    8.     <servlet-name>InitParamServlet</servlet-name>  
    9.     <servlet-class>com.ls.servletd_01.InitParamServlet</servlet-class>  
    10.     <init-param>  
    11.         <param-name>ref</param-name>  
    12.         <param-value>liusheng</param-value>  
    13.     </init-param>  
    14.  </servlet>  
    15.  <servlet-mapping>  
    16.     <servlet-name>InitParamServlet</servlet-name>  
    17.     <url-pattern>/InitParamServlet</url-pattern>  
    18.   </servlet-mapping>  
    19.   <welcome-file-list>  
    20.     <welcome-file>index.jsp</welcome-file>  
    21.   </welcome-file-list>  
    22. </web-app>    

     

    程序运行结果:在Tomcat后台打印

                       初始化参数:liusheng


    用<init-param>直接配置初始化

    <param-name>表示参数名称

    <param-value>表示参数的内容

     

     

    注意:

        在Servlet中初始化方法一共有init()和init(ServletConfig config)两个,如果两个初始化方法同时出现,则调用的是init(ServletConfig config)方法。

     

    Servlet取得其他内置对象:

       

        1、取得HttpSession实例

    在servlet程序中要想取得一个session对象,则可以通过HttpServletRequest接口完成,有以下操作方法:

    public HttpSession getSession()      返回当前的session

    public HttpSession  getSession(boolean  create)     返回当前的session,如果没有则创建一个新的session对象返回

     

    取得HttpSession对象---HttpSessionservlet.java

    [java]  view plain  copy
    1. package com.ls.servlet_02;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.PrintWriter;  
    5.   
    6. import javax.servlet.ServletException;  
    7. import javax.servlet.http.HttpServlet;  
    8. import javax.servlet.http.HttpServletRequest;  
    9. import javax.servlet.http.HttpServletResponse;  
    10. import javax.servlet.http.HttpSession;  
    11.   
    12. public class HttpSessionservlet extends HttpServlet {  
    13.   
    14.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
    15.             throws ServletException, IOException {  
    16.         HttpSession ses = request.getSession();  
    17.         System.out.println("SESSION-->" + ses.getId());  
    18.         ses.setAttribute("username""刘胜");  
    19.         System.out.println("username属性内容是:" + ses.getAttribute("username"));  
    20.     }  
    21.   
    22.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    23.             throws ServletException, IOException {  
    24.         this.doGet(request, response);  
    25.   
    26.     }  
    27.   
    28. }  

    配置web.xml文件

    [java]  view plain  copy
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7.  <servlet>  
    8.     <servlet-name>HttpSession</servlet-name>  
    9.     <servlet-class>com.ls.servlet_02.HttpSessionservlet</servlet-class>  
    10.   </servlet>  
    11.  <servlet-mapping>  
    12.     <servlet-name>HttpSession</servlet-name>  
    13.     <url-pattern>/servlet_HttpSession</url-pattern>  
    14.   </servlet-mapping>  
    15.   <welcome-file-list>  
    16.     <welcome-file>index.jsp</welcome-file>  
    17.   </welcome-file-list>  
    18. </web-app>  


    程序运行结果: Tomcat后台显示

               


     本程序通过getSession()方法取得了一个HttpSession对象后,输出了Session Id以及属性的设置及取得操作。

     

          2、取得ServletContext实例

    application内置对象是ServletContext 接口的实例,表示的是Servlet上下文。如果要在一个servlet中使用此现象,直接通过GenericServlet类提供的方法即可:

    public ServletContext getServletContext()      取得ServletContext对象

     

    取得application对象-----ServletContext.java

    [java]  view plain  copy
    1. package com.ls.servlet_03;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.PrintWriter;  
    5.   
    6. import javax.servlet.ServletException;  
    7. import javax.servlet.http.HttpServlet;  
    8. import javax.servlet.http.HttpServletRequest;  
    9. import javax.servlet.http.HttpServletResponse;  
    10.   
    11. public class ServletContext extends HttpServlet {  
    12.   
    13.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
    14.             throws ServletException, IOException {  
    15.         javax.servlet.ServletContext app =super.getServletContext();  
    16.         System.out.println("真实路径:"+app.getRealPath("/"));  
    17.     }  
    18.   
    19.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    20.             throws ServletException, IOException {  
    21.   
    22.         this.doGet(request, response);  
    23.     }  
    24.   
    25.       
    26. }  


    配置web.xml文件

    [java]  view plain  copy
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7.  <servlet>  
    8.     <servlet-name>ServletContext</servlet-name>  
    9.     <servlet-class>com.ls.servlet_03.ServletContext</servlet-class>  
    10.   </servlet>  
    11. <servlet-mapping>  
    12.     <servlet-name>ServletContext</servlet-name>  
    13.     <url-pattern>/servlet_ServletContext</url-pattern>  
    14.   </servlet-mapping>  
    15.   <welcome-file-list>  
    16.     <welcome-file>index.jsp</welcome-file>  
    17.   </welcome-file-list>  
    18. </web-app>  


    程序运行结果:  Tomcat后台输出

               

     

        本程序通过getServletContext()方法取得ServletContext实例后,将虚拟目录所对应的真实路径输出。

     

     

     

     

     

                                                                                                            


    展开全文
  • 有学生调程序,是要建顺序。  他的程序是这样的:#include #include <malloc.h>#define MaxSize 50 //Maxsize将用于后面定义存储空间的大小 typedef int ElemType; //ElemType在不同场合可以根据问题的需要确定...

      有学生调程序,是要建顺序表。
      他的程序是这样的:

    #include <stdio.h>
    #include <malloc.h>
    
    #define MaxSize 50    //Maxsize将用于后面定义存储空间的大小
    typedef int ElemType;  //ElemType在不同场合可以根据问题的需要确定,在此取简单的int
    typedef struct
    {
        ElemType data[MaxSize];  //利用了前面MaxSize和ElemType的定义
        int length;
    } SqList;
    
    //声明自定义函数
    SqList InitList(SqList *L);   //初始化顺序表
    void ListInsert(SqList *L,int i,int b);  //插入函数
    void DispList(SqList *L);    //输出函数
    bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
    
    int main()
    {
        SqList *sq;
        InitList(sq);
        ListInsert(sq, 1, 5);
        ListInsert(sq, 2, 3);
        ListInsert(sq, 1, 4);
        DispList(sq);
        return 0;
    }
    
    //输出线性表DispList(L)
    void DispList(SqList *L)
    {
        int i;
        if (ListEmpty(L))
            return;
        for (i=0; i<L->length; i++)
            printf("%d ",L->data[i]);
        printf("\n");
    }
    
    //判定是否为空表ListEmpty(L)
    bool ListEmpty(SqList *L)
    {
        return(L->length==0);
    }
    
    //初始化顺序表InitList(*L)
    SqList InitList(SqList *L)
    {
        L=(SqList *)malloc(sizeof(SqList));//这里申请了结点空间
        L->length=0;
        return *L;
    }
    
    void ListInsert(SqList *L,int i,int b)   //插入函数
    {
        int j,k;
    
        if(i<1)
        {
            printf("插入位置非法/n");
        }
        for(j=L->length; j>i; j--)
        {
            L->data[j]=L->data[j-1];
        }
        L->data[i]=b;
        L->length++;
    }

      运行结果是这样的:
    这里写图片描述
      他找我帮忙。基本可以断定,内存使用不当,有溢出。
      看一下编译提示的信息,有一个警告:
      D:\CB\DS\main.cpp|21|warning: ‘sq’ is used uninitialized in this function [-Wuninitialized]|
      说在21行,sq未经初始化就使用了。通俗的说法,野指针。
      围绕着sq找。在main()函数中有:

        SqList *sq;
        InitList(sq);

      这里在调用InitList时,实际参数sq就是野指针。但这还不是出问题的关键,看InitList函数的定义是:

    //初始化顺序表InitList(*L)
    SqList InitList(SqList *L)
    {
        L=(SqList *)malloc(sizeof(SqList));//这里申请了结点空间
        L->length=0;
        return *L;
    }

      调用时,L得到的是野指针,但在函数里为其分配空间了。但调用完,这个地址并未返回到main函数中。调用完InitList,sq仍然还是野指针。这是关键!
      沿这个思路,希望能将分配的空间地址能返回给main函数。return *L就不合适了,return L是返回地址。于是,函数定义改为:

    //初始化顺序表InitList(*L)
    SqList *InitList(SqList *L)
    {
        L=(SqList *)malloc(sizeof(SqList));//这里申请了结点空间
        L->length=0;
        return L;
    }

      既然参数SqList *L调用时给的是个野指针,不要也罢。于是改选成无参函数:

    //初始化顺序表InitList(*L)
    SqList *InitList()
    {
        SqList *L=(SqList *)malloc(sizeof(SqList));//这里申请了结点空间
        L->length=0;
        return L;
    }

      在调用时,main函数定义为:

    int main()
    {
        SqList *sq;
        sq = InitList();
        ListInsert(sq, 1, 5);
        ListInsert(sq, 2, 3);
        ListInsert(sq, 1, 4);
        DispList(sq);
        return 0;
    }

      为保证程序能够正确编译,函数声明等处的语法问题不一一列出。解决了这一环节的问题,程序能够运行了,但结果:
      这里写图片描述
      断定问题出在ListInsert函数中。看调用,插入的位置用的是逻辑序(从1开始记数),但函数定义中,直接L->data[i]=b;没有考虑物理存储中,下标是从0开始的。
      所以,在ListInsert中加入一个 i–,完成逻辑序号向物理序号的转换,Done。
      正确的结果不贴图了,最后改过的程序是:

    #include <stdio.h>
    #include <malloc.h>
    
    #define MaxSize 50    //Maxsize将用于后面定义存储空间的大小
    typedef int ElemType;  //ElemType在不同场合可以根据问题的需要确定,在此取简单的int
    typedef struct
    {
        ElemType data[MaxSize];  //利用了前面MaxSize和ElemType的定义
        int length;
    } SqList;
    
    //声明自定义函数
    SqList *InitList();   //初始化顺序表
    void ListInsert(SqList *L,int i,int b);  //插入函数
    void DispList(SqList *L);    //输出函数
    bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
    
    int main()
    {
        SqList *sq;
        sq = InitList();
        ListInsert(sq, 1, 5);
        ListInsert(sq, 2, 3);
        ListInsert(sq, 1, 4);
        DispList(sq);
        return 0;
    }
    
    //输出线性表DispList(L)
    void DispList(SqList *L)
    {
        int i;
        if (ListEmpty(L))
            return;
        for (i=0; i<L->length; i++)
            printf("%d ",L->data[i]);
        printf("\n");
    }
    
    //判定是否为空表ListEmpty(L)
    bool ListEmpty(SqList *L)
    {
        return(L->length==0);
    }
    
    //初始化顺序表InitList(*L)
    SqList *InitList()
    {
        SqList *L=(SqList *)malloc(sizeof(SqList));//这里申请了结点空间
        L->length=0;
        return L;
    }
    
    void ListInsert(SqList *L,int i,int b)   //插入函数
    {
        int j;
    
        if(i<1)
        {
            printf("插入位置非法/n");
        }
        i--;
        for(j=L->length; j>i; j--)
        {
            L->data[j]=L->data[j-1];
        }
        L->data[i]=b;
        L->length++;
    }
    展开全文
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名...
  • 指针初始化

    千次阅读 2017-09-11 19:16:51
    ·虚是怎么实现的?虚存放在哪里? ·虚中的数据是在什么时候确定的? ·对象中的虚指针又在什么时候赋值的? 我们很难通过 C++语言本身来找到答案。 C++标准给编译器实现者定义了语法规范,但是...
  • MyBatis - 初始化(十一)SQL初始化(下) 该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对各位读者会不太友好,阅读前需要对 MyBatis 和 Spring 有一定的了解。比较适合刚接触,会使用但是一直没...
  • 问题导入传统的应用编写时,每添加一个模块,都需要在main中添加新模块的初始化使用__attribute__((section()))构建初始化函数后,由模块告知main:“我要初始化“,添加新模块再也不需要在main代码中显式调用模块...
  • C++使用初始化列表初始化数据成员的三种情况

    万次阅读 多人点赞 2018-08-11 15:04:27
    1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员(构造函数列表的初始化方式不是按照列表的的顺序,而是按照变量声明的顺序同时初始化显隐数据成员); 2.进入构造函数后在构造函数中执行一般赋值与计算。...
  • //结束符为/ 、函数、存储过程都要以/结尾 sqlExec .setDelimiter ( "/" ) ; //设置脚本路径 FileSet fileSet=new FileSet() ; fileSet .setProject (new Project()) ; fileSet .setDir (new File(path+...
  • goldengate–使用filter+@GETENV在线重新初始化指定的table   八月 9th, 2011 @ Kevin.yuan |【转载时请务必以超链接形式标明文章原始出处和作者信息】 在oracle-oracle goldengate的复制环境中,有时候会碰到...
  • redis 服务器初始化

    千次阅读 2016-11-21 15:53:38
    初始化服务器 从启动 Redis 服务器,到服务器可以接受外来客户端的网络连接这段时间, Redis 需要执行一系列初始化操作。 整个初始化过程可以分为以下六个步骤: 初始化服务器全局状态。 载入配置文件。 创建 ...
  • 初始化全局map

    万次阅读 2014-04-28 15:48:30
    通常,初始化std::map的时候是直接把初始值的pair依次insert到map里的。 ……typedef pair const int, int> cInt2Int;map int, int> m1; // value_type can be used to pass the correct type// explicitly to ...
  • 数据库初始化过程

    千次阅读 2013-11-21 08:47:52
    从数据文件到内存的初始化过程:   SQL> startup mount ORACLE 例程已经启动。   Total System Global Area 1970937856 bytes Fixed Size 2191096 bytes Variable Size 553648392 bytes Database Buf
  • 深度学习——Xavier初始化方法

    万次阅读 多人点赞 2016-05-07 18:39:44
    “Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》,可惜直到近两年,这个方法才逐渐得到更多人...
  • 1,顺序初始化,创建,结构体中饱含元素--学号,姓名,创建完毕后打印输出 1顺序的定位,通过学号定位姓名,输出学号信息输出姓名, 3顺序的插入和删除(插入删除后输出剩余中学生信息并打印输出 打印格式如下 ...
  • windows下初始化格式化磁盘

    千次阅读 2018-07-31 19:53:53
    新买来的硬盘是未初始化的,以我的理解就是没有引导扇区的,通常是没有...左边显示“没有初始化”, 点鼠标右键就可以【初始化磁盘】。 初始化时可以选择MBR和GPT, MBR方式顶多支持2T硬盘的。 初始化后 ...
  • Memcached源码阅读之资源初始化

    千次阅读 2014-03-19 13:36:53
    Memcachedhash,各种统计信息,工作线程,内存结构的初始化流程。
  • 数组的初始化

    千次阅读 2017-07-30 11:20:50
     一直以来,初始化变量和数组常采用定义时赋值的方法,今天在定义一个结构体的时候发现了一些问题,查了下相关资料发现以往的使用确实有些误区,一直没有注意到,于是搜集了下零散的资料在此记录一下。 一、以往...
  • 使用__attribute__((section()))构建初始化函数后,由模块告知main:“我要初始化“,添加新模块再也不需要在main代码中显式调用模块初始化接口。 以此实现main与模块之间的隔离,main不再关心有什么模块,...
  • JAVA中初始化数据的方法?

    千次阅读 2016-07-23 20:34:33
    JAVA中如何初始化数据呢(也就是说怎么给数据赋值)? (1)利用构造方法初始化最为常见,为数据赋初值 (2)利用初始化块为数据赋初值 (3)利用静态初始化块为数据赋初值(不过静态初始化块只能为静态成员变量赋...
  • c++中变量未初始化的隐患

    千次阅读 2018-03-06 15:42:08
    变量未初始化是C++编程中最为常见和易犯的错误之一。但是对于全局变量,我们可以不进行初始化,这个变量会默认的用零进行初始化,但是这通常不是一个好的习惯。我们今天先不探讨全局变量还是静态全局变量。那么对于...
  • 在多次插入同一个时,因为使用了同一个结构体,会产生冲突 此时有两种解决办法 1、声明新的结构体别名 var user models.User var user1 models.User ...2、初始化结构体 ...初始化结构体再进行第二次插入...
  • 变量未初始化是C++编程中最为常见和易犯的错误之一。但是对于全局变量,我们可以不进行初始化,这个变量会默认的用零进行初始化,但是这通常不是一个好的习惯。我们今天先不探讨全局变量还是静态全局变量。那么对于...
  • 顺序初始化(常见用法)

    千次阅读 2016-03-19 19:35:20
    最近几天学习了线性表,现在就写篇博客总结下顺序的常见用法,便于以后复习时用。#include <iostream> #include <stdio.h> #include <stdlib.h> #include <ctime> using namespace std; #...
  • 配置系统未能初始化 错误的解决方案 配置系统未能初始化 错误的解决方案
  • 顺序,全名顺序存储结构,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序自然也不例外。 不仅如此,顺序对数据的物理存储结构也有要求。顺序...
  • c语言 顺序的基本操作(创建、初始化、赋值、插入、删除、查询、替换、输出) 1、创建、申请空间 2、初始化、顺序数据结构大小、长度 3、赋值、顺序数据结构赋值 4、插入、在指定位置插入数据,后续数据...
  • 普元EOS之我要初始化数据库

    千次阅读 2017-10-25 09:26:28
    普元EOS之我要初始化数据库
  • jQuery Datatable插件 表格基本初始化

    万次阅读 2016-11-15 16:13:05
    jQuery Datatable插件 表格基本初始化本文介绍jQuery Datatable插件的表格初始化的基本使用,Datatable是目前使用度比较高的前端表格界面插件,可以很方便地创建响应式的表格,容易实现表格的翻页、过滤、排序等功能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 713,110
精华内容 285,244
关键字:

初始化信息表