第 章 Struts2 核心组件 2.1 Struts2 动作 (Action) Action 的作用 Struts2 的动作 (Action) 组件是 Struts2 框架的核心 Action 主要有三个作用 : 第一, 为给定的请求封装需要做的实际工作 ; 第二, 在从请求到视图的框

Size: px
Start display at page:

Download "第 章 Struts2 核心组件 2.1 Struts2 动作 (Action) Action 的作用 Struts2 的动作 (Action) 组件是 Struts2 框架的核心 Action 主要有三个作用 : 第一, 为给定的请求封装需要做的实际工作 ; 第二, 在从请求到视图的框"

Transcription

1 第 章 Struts2 核心组件 2.1 Struts2 动作 (Action) Action 的作用 Struts2 的动作 (Action) 组件是 Struts2 框架的核心 Action 主要有三个作用 : 第一, 为给定的请求封装需要做的实际工作 ; 第二, 在从请求到视图的框架自动数据传输中作为中介 ; 第三, 帮助框架确定要返回的视图 1. 动作封装工作单元动作在框架中可作为 MVC 模式的模型 这个角色的主要职责是控制业务逻辑, 动作使用 execute() 方法来实现业务逻辑 这个方法中的代码应该只关注与请求相关的工作逻辑 2. 动作为数据转移提供场所动作是框架的模型组件, 使得动作能够携带数据 由于数据保存在动作本地, 在执行业务逻辑的过程中就可以很方便地访问到它们 或许一系列的 JavaBean 属性会增加动作组件的代码量, 但是当 execute() 方法引用这些属性中存储的数据时, 邻近的数据会让动作的代码变得更简洁 3. 动作为结果路由选择返回控制字符串动作组件的最后一个职责是返回控制字符串以选择应该被呈现的结果页面 先前的框架将路由对象 (ActionMapping) 整体传递给了动作组件的入口方法 返回的控制字符串消除了对这些对象的依赖, 使得方法签名更简洁, 并且降低了动作与具体路由代码的耦合 返回字符串的值必须与配置在声明性架构中期望的结果的名字匹配 例如,HelloWorldAction 返回 SUCCESS 字符串, 可以从 XML 配置文件中看出,SUCCESS 是某一个结果组件的名字 14

2 2.1.2 Action 类的编写 为了让用户开发的 Action 类更加规范,Struts2 提供了一个 Action 接口, 这个接口定义了 Struts2 的 Action 类应该实现的规范 下面是标准 Action 接口的代码 : public interface Action { // 定义 Action 接口里包含的一些结果字符串 public static final String ERROR = "error"; public static final String INPUT = "input"; public static final String LOGIN = "login"; public static final String NONE = "none"; public static final String SUCCESS = "success"; // 定义处理用户请求的 execute() 方法 public String execute() throws Exception; 上面的 Action 接口里只定义了一个 execute() 方法, 该接口规范规定了 Action 类应该包含一个 execute() 方法, 该方法返回一个字符串, 此外, 该接口还定义了 5 个字符串常量, 它的作用是统一 execute() 方法的返回值 例如, 当 Action 类处理完用户请求后, 有人喜欢返回 welcome 字符串, 有人喜欢返回 success 字符串, 如此不利于项目的统一管理,Struts2 的 Action 接口定义加上了如上的 5 个字符串常量 :ERROR NONE INPUT LOGIN SUCCESS 等, 分别代表了特定的含义 当然, 如果开发者依然希望使用特定的字符串作为逻辑视图名, 开发者依然可以返回自己的视图名 另外,Struts2 还为 Action 接口提供了一个实现类 :ActionSupport, 下面是该实现类部分的代码, 具体的实现代码读者可以参考 Struts2 的源码包 public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable { // 默认处理用户请求的方法, 直接返回 SUCCESS 字符串 public String execute() throws Exception { return public Locale getlocale() { return public String gettext(string arg0) { return public ResourceBundle gettexts() { return public void addactionerror(string arg0) 15

3 public void validate() { // 省略部分需要实现接口的方法 ActionSupport 是一个默认的 Action 实现类, 该类里已经提供了许多默认方法, 这些方法包括获取国际化信息的方法 数据校验的方法 默认的处理用户请求的方法等 实际上, ActionSupport 是 Struts2 默认的 Action 处理类, 如果让开发者的 Action 类继承该 ActionSupport 类, 则会大大简化 Action 的开发 Action 的使用与配置 现在可以开始开发动作了 在本节中, 首先讲解 Action 的配置, 接着讲解 Action 类的具体编写使用 Struts2 的 Action 的配置是在 struts.xml 中进行的, 通过 <action> 元素进行配置, <action> 元素常用的属性有如下几个 : name: 该属性用来指定客户端发送请求的地址映射名称 ; class: 该属性用来指定业务逻辑处理的 Action 类名称 ; method: 该属性用来指定进行业务逻辑处理的 Action 类中的方法名称 一个典型的 action 配置如下 : <action name="sayhello" class="cap.action.helloworldaction" method="sayhello"> <result name="success">/output.jsp</result> </action> 在上述 Action 代码配置中, 为 action 指定 name,class 和 method 属性 method 属性值就是 Action 类中定义的方法名, 在默认情况下是 execute() 方法 通常要为 Action 指定一个或多个视图, 这些视图的名称或类型通过 result 元素来配置, 该元素主要有 type 和 name 属性 result 元素的 name 属性用来指定 Action 中方法返回的名称, 例如上面的代码片段返回 SUCCESS 1. 动态 Action 调用实际应用中, 每个 Action 都要处理很多业务, 所以每个 Action 都要包含多个处理业务逻辑的方法 针对不同的客户端请求,Action 都会调用不同的方法来处理 Struts2 提供使用 method 属性实现方法的动态调用 实现的步骤如下 : 首先在表单中的 action 中指定 action 的名称, 例如下面的代码 : <form action="login" method="post"> 其次在 struts.xml 中配置 action 名称 : <action name="login" class="cap.action.loginaction" method="login"> <result name="success">/output.jsp</result> </action> 下面将通过一个具体的例子讲解动态 Action 调用的方法 (1) 继续在 struts1 工程中, 在 HelloWorldAction 中添加 SayHello 的方法, 在 struts2 中定义方法的原型如下 : public String somemethod(){ 16

4 (2) 在 src 下的 cap.action 子包中的 HelloWorldAction.java 文件中添加 SayHello 方法, 实现代码如下 : public String sayhello(){ username=" 欢迎您 :" +username; return SUCCESS; (3) 在 src 中的 sturts.xml 文件中写入以下的代码 : <action name="sayhello" class="cap.action.helloworldaction" method="sayhello"> <result name="success">/output.jsp</result> </action> (4) 在 WebContent 下复制 sayhi.jsp, 重命名为 sayhello.jsp 将 form 标签中 action 属性的值修改为 sayhello (5) 运行工程 : 在浏览器中输入 地址来访问 HelloWorld Action 如图 2-1 所示, 输入 starlee2008@163.com 文本, 单击 提交 按钮 返回结果页面如图 2-2 所示 图 2-1 sayhello 运行结果 1 图 2-2 sayhello 运行结果 2 通过上面的例子, 可以发现 src/cap.action 子包中 HelloWorldAction.java 类的 Action 方法 17

5 (execute 和 sayhello) 返回的都是 SUCCESS 这个属性变量在 ActionSupport 类或其父类中定义 2. 向对象传递数据使用 Struts2, 用对象传递数据将变得非常方便, 和普通的 POJO(Plain Ordinary Java Object, 简单的 Java 对象, 实际就是普通 JavaBeans, 是为了避免和 EJB 混淆所创造的简称词 ) 一样在 Action 编写 Getter 和 Setter, 然后在 JSP 的 UI 标志的 name 与其对应, 在提交表单到 Action 时, 就可以获得其值 下面我们看一个具体向对象传递数据的例子 (1) 按照第 1 章的内容在 Eclipse 中新建 Dynamic Web Project 工程 struts2 首先在 WebContent 下新建 login.jsp 页面, 在 body 标签中添加下面的代码 : <form action="login" method="post"> <input type="text" name="admin.username"><br> <input type="password" name="admin.password"><br> <input type="submit" value=" 登录 "> </form> (2) 在 src 的 cap.bean 包中新建 Admin.java 类, 编辑后的代码如下 : package cap.bean; public class Admin { private int id; private String username; private String password; // 省略 getters 和 setters (3) 在 src 的 cap.action 包中新建 LoginAction 类, 编辑后的代码如下 : package cap.action; import cap.bean.admin; import com.opensymphony.xwork2.actionsupport; public class LoginAction extends ActionSupport{ private Admin admin; public Admin getadmin() { return admin; public void setadmin(admin admin) { this.admin = admin; public String login(){ if(admin.getusername().equals("starlee2008")&&admin.getpassword().equals("starlee2008")) { return SUCCESS; else{ return ERROR; 18

6 代码解释 : 这里没有采用数据库验证登录的方式, 采用的是静态判断, 只要输入的用户名和密码都为 starlee2008 时, 返回登录成功的 SUCCESS 字符串, 反之返回 ERROR 的字符串 (4) 在 src 的 struts 配置文件 struts.xml 中添加下面的代码 : <action name="login" class="cap.action.loginaction" method="login"> <result name="success">/result.jsp</result> <result name="error">/error.jsp</result> </action> (5) 还需添加登录判断后的两种跳转页面, 分别是 result.jsp 和 error.jsp, 可查看随书提供的示例源码 运行 Tomcat, 在浏览器地址栏中键入 出现如图 2-3 所示页面 在 User 和 name 中分别输入 cap 和 cap, 单击 登录 按钮, 出现如图 2-4 所示页面 如果输入了错误的用户名和密码, 会提示登录失败 图 2-3 login.jsp 运行 图 2-4 登录结果 3. 模型驱动所谓模型驱动, 就是使用单独的 JavaBean 实例来贯穿整个 MVC 流程 简单地说, 模型驱动就是使用单独的 VO(Value Object, 值对象 ) 来封装请求参数和处理结果 使用模型驱动模式时,Action 必须实现 ModelDriven 接口, 实现该接口则必须实现 getmodel 方法, 该方法用于把 Action 和与之对应的 Model 实例关联起来 下面继续通过一个案例讲解模型驱动的使用 (1) 继续在工程 struts2 中操作 在 src 的 cap.action 包中新建 LoginxAction 类, 编辑后的代码如下 : 19

7 package cap.action; import cap.bean.admin; import com.opensymphony.xwork2.actionsupport; import public class LoginxAction extends ActionSupport implements ModelDriven<Admin>{ private Admin admin; public Admin getadmin() { return admin; public void setadmin(admin admin) { this.admin = admin; public String loginx(){ if(admin.getusername().equals("cap")&&admin.getpassword().equals("cap")) return SUCCESS; else return public Admin getmodel() { if(admin==null){ admin=new Admin(); return admin; 代码解释 :loginx 方法和前一节的方法功能相同, 实现静态的用户名和密码判断,getModel 方法主要是创建一个 Admin 的对象 admin, 并根据页面 loginx.jsp 传递过来的 username 和 password 值, 通过调用对象 admin 的 setusername 方法和 setpassword 方法设置值 (2) 在 WebContent 中新建 loginx.jsp, 在 body 标签中添加如下的代码 : <form action="loginx" method="post"> <input type="text" name="username"><br> <input type="password" name="password"><br> <input type="submit" value=" 登录 "> </form> 代码解释 : 和 login.jsp 页面的主要区别是本页面采用传递的是属性值, 而不是采用对象名. 属性值 (admin.username) 的方法传递值 实现 ModelDriven 接口后, 会通过 getmodel 创建 Admin 对象 admin, 并初始化其值 (3) 在 src 下的 struts.xml 文件中添加下面的代码 : <action name="loginx" class="cap.action.loginxaction" method="loginx"> <result name="success">/result.jsp</result> <result name="error">/error.jsp</result> </action> 20

8 2.2 Struts2 拦截器 (Interceptor) 拦截器 拦截器实质就是 AOP( 面向切面编程 ) 的编程思想 拦截器允许在 Action 处理之前, 或者 Action 处理结束之后, 插入开发者自定义的代码 拦截器体系是 Struts2 的一个重要组成部分, 对于 Struts2 框架而言, 可以将其理解为一个空容器, 正是大量的内建拦截器完成了该框架的大部分操作 对于 Struts2 的拦截器体系而言, 当需要使用某个拦截器时, 只需要在配置文件中应用该拦截器即可, 如果不需要使用该拦截器, 也只需要在配置文件中取消该拦截器, 不管是否应用某个拦截器, 对于整个 Struts2 框架不会有任何影响 这种设计方式非常灵活, 可扩展性好 因为 Struts2 框架的拦截器是动态配置的, 所以开发者可以非常方便地扩展 Struts2 框架, 只要实现 Interceptor 接口或者继承 AbstractInterceptor 类, 并将其配置在 struts.xml 文件中即可 实际上, 在 Struts2 中开发自定义拦截器非常便利, 因此, 开发者可非常方便地将多个 Action 中需要重复执行的动作放在拦截器中定义, 从而提供更好的代码复用 虽然拦截器很重要, 但是一般不会去编写很多拦截器 实际上,Web 应用程序领域常见任务已经编写和捆绑进了 struts-default 包 1. 拦截器的工作原理现在来看看拦截器是如何工作的 拦截器 ActionInvocation 类负责指挥着动作的完整执行, 以及与之相关的拦截器栈的顺序触发 ActionInvocation 类封装了与特定动作执行相关的所有处理细节 当框架收到一个请求时, 它首先必须决定这个 URL 映射到哪个动作 这个动作的一个实例会被加入到一个新创建的 ActionInvocation 实例中 接着, 框架查询声明性架构 ( 通过应用程序的 XML 或者 Java 注解创建 ), 以发现哪些拦截器应该触发, 以及按照什么样的顺序触发 指向这些拦截器的引用被加入到 ActionInvocation 类中 除了这些核心元素,ActionInvocation 还具有其他重要信息 ActionInvocation 类创建好并且填充了需要的所有对象和信息, 就可以开始调用 ActionInvocation 类公开了 invoke() 方法, 框架通过调用这个方法开始动作的执行 当框架调用这个方法时,ActionInvocation 通过执行拦截器栈中的第一个拦截器开始这个调用过程, 但需注意,invoke() 方法并不总是映射到第一个拦截器 如图 2-5 所示, 第一个被触发的拦截器是 exception 拦截器 从这里开始, 每一个拦截器按照与从上到下相同的顺序触发 因此, 最后一个被触发的拦截器会是 workflow 拦截器 在结果被呈现之后, 拦截器会按照相反的顺序再触发一遍, 使它们有机会做后续处理 后续拦截器继续执行, 最终执行动作, 这些都通过递归调用 ActionInvocation 的 invoke() 方法实现 每次 invoke() 方法被调用时,ActionInvocation 都会查询自身的状态, 调用接下来的任何一个拦截器 在所有的拦截器都被调用之后,invoke () 方法会促使动作类执行 21

9 图 2-5 ActionInvocation 封装了动作及与之关联的拦截器和结果的执行 拦截器的执行周期, 主要分为三个阶段 : 第一阶段, 做一些预处理 第二阶段, 通过调用 invoke() 方法将控制转移给后续的拦截器, 最后直到动作, 或者通过返回一个控制字符串中断执行 第三阶段, 做一些后加工 通常, 使用拦截器可以解决如权限控制 跟踪日志 跟踪系统的性能瓶颈等问题 2. 拦截器的配置 Struts2 框架自带很多内置栈, 使内置拦截器方便排列 可以通过扩展 struts-default.xml 文件中定义的 struts-default 包来继承包含 defaultstack 在内的所有内建的栈 拦截器的配置代码片段如下 : <action name="timer" class="cap.action.timeraction"> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="logger"></interceptor-ref> <result name="success">/result.jsp</result> </action> 上述代码实现将 timer 和 logger 拦截器与动作 (timer) 关联起来, 它们会按被列出的顺序触发 Struts2 已经提供丰富多样的, 功能齐全的拦截器实现 在 struts2-core-2.x.x.jar 包的 strutsdefault.xml 文件中可以查看关于默认的拦截器与拦截器链的配置 下面列出了在 struts-default.xml 文件定义的部分拦截器 : <interceptors> <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.aliasinterceptor"/> <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor. ActionAutowiringInterceptor"/> <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.chaininginterceptor"/> <interceptor name="conversionerror" class="org.apache.struts2.interceptor. StrutsConversionErrorInterceptor"/> <interceptor name="cookie" class="org.apache.struts2.interceptor.cookieinterceptor"/> <interceptor name="cookieprovider" class="org.apache.struts2.interceptor. CookieProviderInterceptor"/> <interceptor name="clearsession" class="org.apache.struts2.interceptor. ClearSessionInterceptor" /> <interceptor name="createsession" class="org.apache.struts2.interceptor. CreateSessionInterceptor" /> <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging. DebuggingInterceptor" /> 22

10 <interceptor name="execandwait" class="org.apache.struts2.interceptor. ExecuteAndWaitInterceptor"/> <interceptor name="exception" class="com.opensymphony.xwork2.interceptor. ExceptionMappingInterceptor"/> <interceptor name="fileupload" class="org.apache.struts2.interceptor.fileuploadinterceptor"/> <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.i18ninterceptor"/> <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.logginginterceptor"/> <interceptor name="modeldriven" class="com.opensymphony.xwork2.interceptor. ModelDrivenInterceptor"/> <interceptor name="scopedmodeldriven" class="com.opensymphony.xwork2.interceptor. ScopedModelDrivenInterceptor"/> <interceptor name="params" class="com.opensymphony.xwork2.interceptor. ParametersInterceptor"/> <interceptor name="actionmappingparams" class="org.apache.struts2.interceptor. ActionMappingParametersInteceptor"/> <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor. PrepareInterceptor"/> <interceptor name="staticparams" class="com.opensymphony.xwork2.interceptor. StaticParametersInterceptor"/> <interceptor name="scope" class="org.apache.struts2.interceptor.scopeinterceptor"/> <interceptor name="servletconfig" class="org.apache.struts2.interceptor. ServletConfigInterceptor"/> <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.timerinterceptor"/> <interceptor name="token" class="org.apache.struts2.interceptor.tokeninterceptor"/> <interceptor name="tokensession" class="org.apache.struts2.interceptor. TokenSessionStoreInterceptor"/> <interceptor name="validation" class="org.apache.struts2.interceptor.validation. AnnotationValidationInterceptor"/> <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor. DefaultWorkflowInterceptor"/> <interceptor name="store" class="org.apache.struts2.interceptor.messagestoreinterceptor" /> <interceptor name="checkbox" class="org.apache.struts2.interceptor.checkboxinterceptor" /> <interceptor name="profiling" class="org.apache.struts2.interceptor. ProfilingActivationInterceptor" /> <interceptor name="roles" class="org.apache.struts2.interceptor.rolesinterceptor" /> <interceptor name="annotationworkflow" class="com.opensymphony.xwork2.interceptor. annotations.annotationworkflowinterceptor" /> <interceptor name="multiselect" class="org.apache.struts2.interceptor.multiselectinterceptor" /> 如果您想要使用 struts-default.xml 文件中定义的上述拦截器, 还需要在应用程序 struts.xml 文件中进行一些设置, 后续将用具体案例来讲解 3. 使用拦截器栈 Struts2 允许将多个拦截器组合在一起, 形成一个拦截器栈 对于 Struts2 系统而言, 多个拦截器组成的拦截器栈对外也表现为一个拦截器 例如, 在 Action 执行前同时做登录检查 安全检查和记录日志, 则可以把这三个动作对应的拦截器组成一个拦截器栈 定义拦截器栈使用 <intercepter-stack.../> 元素, 并且需要在其中使用 <intercepter-ref /> 元素来定义多个拦截器的引用, 即该拦截器栈由多个 <intercepter-ref.../> 元素指定的拦截器组成 下面是典型的拦截器栈的 23

11 定义代码片段 <interceptors> <!-- 添加登录拦截器 --> <interceptor name="checklogin" class="cap.util.checklogininterceptor"/> <!-- 新建一个栈, 把登录拦截器和默认的栈放进去 --> <interceptor-stack name="mystack"> <interceptor-ref name="defaultstack"/> <interceptor-ref name="checklogin"/> </interceptor-stack> </interceptors> 一旦定义了拦截器和拦截器栈后, 就可以使用这个拦截器或拦截器栈来拦截 Action 了, 拦截器 ( 包含拦截器栈 ) 的拦截行为将会在 Action 的 execute 方法执行之前被执行 通过 <interceptor-ref.../> 元素可以在 Action 内使用拦截器 拦截器的使用 1. 预定义拦截器案例下面将使用实例讲解拦截器 timer 的使用 (1) 在 Eclipse 中新建工程 struts3, 在 src 的 cap.action 包中新建 TimerAction 类, 编辑后的代码如下 : package cap.action; import public class TimerAction extends ActionSupport{ public String timer() { try { Thread.sleep(500);// 代码 catch (InterruptedException e) { e.printstacktrace(); return SUCCESS; 代码解释 : 代码 调用线程 Thread 类的静态方法实现睡眠 5 秒钟 (2) 在 src 的 struts.xml 文件中 package 标签处添加如下的代码 : <action name="timer" class="cap.action.timeraction"> <interceptor-ref name="timer"></interceptor-ref> <result name="success">/result.jsp</result> </action> (3) 发布运行应用程序, 在浏览器的地址栏键入 在出现 result.jsp 页面后, 查看服务器的后台输出 24

12 十一月 12, :49:30 下午 com.opensymphony.xwork2.util.logging.jdk.jdklogger info 信息 : Executed action [//timer!timer] took 508 ms. 在自己电脑上执行 Timer 拦截器所花的时间, 可能与上述时间有些不同, 其缘由主要是计算机性能差异所造成的 当第一次加载 Timer 时, 需要进行一定的初始工作 当你再次运行, 会发现时间接近 500ms 2. 自定义拦截器案例对于框架 (Framework), 可扩展性是必不可少的特性 虽然,Struts2 提供丰富多样的拦截器实现, 但我们依然可以创建自定义拦截器, 并且也很容易实现 Struts2 的拦截器直接或间接实现接口 com.opensymphony.xwork2.interceptor.interceptor, 另外, 我们也习惯性继承 com.opensymphony.xwork2.interceptor.abstractinterceptor 类 AbstractInterceptor 是 Interceptor 接口的实现类 从 com.opensymphony.xwork2.interceptor.interceptor 接口定义来看,Interceptor 接口只定义了 3 个方法 前 2 个方法是典型的生命周期方法, 作用是初始化或者清理资源 真正的业务逻辑发生在 intercept() 方法中 可以看到, 这个方法被递归的 ActionInvocation.invoke() 方法调用 public interface Interceptor extends Serializable{ public abstract void destory(); public abstract void init(); public abstract String intercept(actioninvocation invocation) throws Exception; Intercept(ActionInvocation() invocation): 该方法是用户需要实现的拦截动作 就像 Action 的 execute 方法一样,intercept() 方法会返回一个字符串作为逻辑视图 如果该方法直接返回了一个字符串, 系统将会跳转到该逻辑视图对应的实际视图资源, 不会调用被拦截的 Action 该方法的 ActionInvocation 参数包含了被拦截的 Action 的引用, 可以通过调用该参数的 invoke 方法, 将控制权转给下一个拦截器, 或者转给 Action 的 execute 方法 下面的例子将展示通过继承 AbstractInterceptor, 实现授权拦截器 3. 自定义拦截器案例 (1) 继续在工程 struts3 中编辑, 在 src 的 cap.util 包下创建登录拦截器 CheckLoginInterceptor 类, 编辑后的代码如下 : package cap.util; import java.util.map; import cap.action.loginaction; import cap.bean.admin; import com.opensymphony.xwork2.action; import com.opensymphony.xwork2.actioninvocation; import public class CheckLoginInterceptor extends public String intercept(actioninvocation ai) throws Exception { System.out.println(" 开始拦截器拦截 "); Object obj=ai.getaction(); if(obj instanceof LoginAction){ 25

13 System.out.println(" 登录 action 不需要拦截 "); return ai.invoke(); Map<String,Object> session=ai.getinvocationcontext().getsession(); Admin admin=(admin)session.get("admin"); if(admin!=null){ System.out.println(" 已经登录 不需要拦截 "); return ai.invoke(); else{ System.out.println(" 你还没有登录 跳转到登录页面 "); return Action.LOGIN; 代码解释 : 在 intercept() 方法中, 首先通过 ActionInvocation 的 getaction 获得对象 object, 接着判断对象 object 是否为 LoginAction 的实例, 如果是, 不需要拦截, 并返回 如果不是 LoginAction 对象的实例, 首先获得 session 对象, 通过检查 session 是否存在键为 admin 的对象 admin, 判断用户是否登录 如果用户已经登录, 将角色放到 Action 中, 调用 Action; 否则, 拦截直接返回 Action.LOGIN 字符串并调转到相应的视图页面 (2) 在 src 的 cap.action 中创建 LoginAction 类, 编辑后的代码如下 : package cap.action; import java.util.map; import org.apache.struts2.interceptor.sessionaware; import com.opensymphony.xwork2.actionsupport; import cap.bean.admin; public class LoginAction extends ActionSupport implements SessionAware{// 代码 private Admin admin; private Map<String,Object> session; public Admin getadmin() { return admin; public void setadmin(admin admin) { this.admin = admin; public String login(){ if(admin.getusername().equals("cap")&&admin.getpassword().equals("cap")){ session.put("admin", admin); return SUCCESS; else return public void setsession(map<string, Object> session) { this.session=session; 26

14 代码解释 : 要在 Action 类中使用 Map<String,Object> session 对象, 需要实现 SessionAware 接口,login() 方法首先判断用户名和密码是否匹配, 如果匹配的话使用 session 将 Admin 的对象 admin 存放在 Map 中名为 admin 如果不匹配, 返回 ERROR 常量 (3) 在 src 的 cap.bean 中创建 Admin 类, 编辑后的代码如下 : package cap.bean; public class Admin { private Integer id; private String username; private String password; // 省略 getters 和 setters (4) 修改 src 下的 struts2 的配置文件 struts.xml, 在 struts.xml 中包含 test.xml, 代码如下 : <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" " <struts> <package name="login" extends="struts-default"> <!-- 添加拦截器 --> <interceptors> <!-- 添加登录拦截器 --> <interceptor name="checklogin" class="cap.util.checklogininterceptor"/> <!-- 新建一个栈, 把登录拦截器和默认的栈添加进去 --> <interceptor-stack name="mystack"> <interceptor-ref name="defaultstack"/> <interceptor-ref name="checklogin"/> </interceptor-stack> </interceptors> <!-- 修改默认拦截器 --> <default-interceptor-ref name="mystack"/> <!-- 将 result 设置为全局的, 这样就不用在每一个 package 里面都添加拦截器了 --> <global-results> <result name="login">/login.jsp</result> </global-results> </package> <include file="test.xml"></include> </struts> 代码解释 :<package> 之间的代码定义了一个包, 其名称为 login,namespace 默认值为 /, 并且继承了 Struts2 的 struts-default 包 接着定义了拦截器栈, 并将拦截器栈的名称命名为 mystack, 其中包含了自定义的拦截器 checklogin, <default-interceptor-ref> 标签把 mystack 拦截器栈设置为默认的拦截器栈,<global-results> 标签定义了一个全局的返回值, 如果返回的字符 27

15 串为 LOGIN, 那么将返回到 loing.jsp 视图 <include> 标签表示包含一个名为 test.xml 的配置文件 (5) 在 src 下创建 test.xml, 编辑后的代码如下 : <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" " <struts> <package name="default" namespace="/" extends="login"> <action name="timer" class="cap.action.timeraction" method="timer"> <result name="success">/result.jsp</result> </action> <action name="login" class="cap.action.loginaction" method="login"> <result name="success">/index.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts> 代码解释 : 这里重新定义了一个 Struts2 的配置文件, 包的名称为 default, 并且继承了 login 包, 这样 login 包里的全局拦截器就会在此包中起到拦截的作用 (6) 在 WebContent 下创建 login.jsp 页面, 在 body 标签中添加下面的代码 : <form action="login" method="post"> <input type="text" name="admin.username"><br> <input type="password" name="admin.password"><br> <input type="submit" value=" 登录 "> </form> (7) 在 WebContent 下创建 index.jsp 页面, 在 body 标签中添加下面的代码 ( 效果见图 2-6): <p> 全局拦截器, 只有登录后才能使得 timer 生效 </p> <a href="timer"> 使用内置的 timer 拦截器, 会在控制台下打印出 action 执行的时间 </a> (8) 发布运行应用程序, 在浏览器地址栏中输入 : 单击页面中的超链接, 由于没有登录, 所以会跳转到 login.jsp 页面, 如图 2-7 所示 图 2-6 index.jsp 运行 28

16 图 2-7 未登录被拦截的结果 2.3 Struts2 注解 (Annotation) 注解 (Annotation) 是 Java 语言比较新的一个特性, 它允许在 Java 源代码文件中直接添加元数据 通常情况下,Struts2 是通过 struts.xml 文件配置的 但是随着系统规模的扩大, 所需要配置的文件就会比较多, 虽然可以根据不同的系统功能将不同模块的配置文件单独书写, 然后通过 <include> 节点将不同的配置文件引入最终的 struts.xml 文件中, 但是毕竟还是要维护和管理这些文件, 使得维护工作变得艰巨 Struts2 声明性架构机制可以配置用来扫描 Java 类以获得与 Struts2 相关的注解 如果要使用 struts2 的注解功能, 必须使用一个包 struts2-convention-plugin-2.x.x.x.jar, 其中 xxx 代表版本号 常用注解 Struts2 中注解的主要概念包括 package action 以及 Interceptor 等, 下面将分别讲解这些概念 : (1)@ParentPackage: 此注解对应 xml 文件中的 package 节点, 它只有一个属性叫 value, 其实就是 package 的 name 属性 ; (2)@Namespace : 命名空间, 也就是 xml 文件中 <package> 的 namespace 属性 ; (3)@Action : 此注解对应 <action> 节点, 可以应用于 action 类上, 也可以应用于方法上 此注解中的常用属性见表 2-1 表 注解的常用属性 属性含义 value results interceptorrefs params exceptionmappings 表示 action 的 URL, 也就是 <action> 节点中的 name 属性表示 action 的多个 result, 这个属性是一个数组属性, 因此可以定义多个 result 表示 action 的多个拦截器 这个属性也是一个数组属性, 因此可以定义多个拦截器这是一个 String 类型的数组, 它按照 name/value 的形式组织, 是传给 action 的参数这是异常属性, 它是一个 ExceptionMapping 的数组属性, 表示 action 的异常, 在使用时必须引用相应的拦截器 29

17 : 这个注解对应 <result> 节点, 只能应用于 action 类上 这个注解中常用属性见表 2-2 表 注解的常用属性 属性含义 name location type params 表示 action 方法的返回值, 也就是 <result> 节点的 name 属性, 默认情况下是 success 表示 view 层文件的位置, 可以是相对路径, 也可以是绝对路径是 action 的类型, 如 redirect,forward 是一个 String 数组, 也是以 name/value 形式传送给 result 的参数 注解的使用 下面将通过一个具体的案例来讲解 Struts2 中注解 (Annotation) 的使用 (1) 在 Eclipse 中, 复制 struts3 工程, 将工程重新命名为 struts4, 如图 2-8 所示 图 2-8 工程复制 (2) 将 src 目录下的 test.xml 配置文件删除, 然后将 struts.xml 文件中的下面代码删除 <include file="test.xml"></include> (3) 编辑 cap.action 下的 LoginActon 类, 编辑后的代码如下 : package cap.action; import java.util.map; import org.apache.struts2.convention.annotation.action; import org.apache.struts2.convention.annotation.interceptorref; import org.apache.struts2.convention.annotation.interceptorrefs; import org.apache.struts2.convention.annotation.parentpackage; import org.apache.struts2.convention.annotation.result; import org.apache.struts2.convention.annotation.results; import org.apache.struts2.interceptor.sessionaware; import com.opensymphony.xwork2.actionsupport; = "success", location = "/index.jsp"), 30

18 @Result(name = "input", location = "/login.jsp") ) public class LoginAction extends ActionSupport implements SessionAware{ private Admin admin; private Map<String,Object> session; public Admin getadmin() { return admin; public void setadmin(admin admin) { this.admin @Result(name="input",location="/login.jsp")) public String login(){ if(admin.getusername().equals("cap")&&admin.getpassword().equals("cap")){ session.put("admin", admin); return SUCCESS; else return public void setsession(map<string, Object> session) { this.session=session; 代码解释 : 注释的具体使用详见表 2-1 和表 2-2 其余的 Java 实现代码和上一节功能相同 (4) 编辑 cap.action 下的 TimerActon 类, 编辑后的代码如下 : package cap.action; import org.apache.struts2.convention.annotation.action; import org.apache.struts2.convention.annotation.interceptorref; import org.apache.struts2.convention.annotation.interceptorrefs; import org.apache.struts2.convention.annotation.parentpackage; import org.apache.struts2.convention.annotation.result; import org.apache.struts2.convention.annotation.results; = "success", location = = "input", location = "/login.jsp") ) public class TimerAction extends public String timer() { try { Thread.sleep(500); 31

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

J2EE MVC with Webwork2 Xwork, to J2EE MVC with Webwork2 Xwork

J2EE MVC with Webwork2 Xwork,  to J2EE MVC with Webwork2 Xwork MVC with Webwork2 Xwork Action...1 ActionContext...3 ActionProxyFactory Factory...4 ActionProxyFactory Proxy AOP...7 XworkInterceptor...8 Interceptor...9 LoginAction...10 LoginInterceptor...12 Action Result

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问 内置对象的取得和多人开发 一 内置对象的取得 在使用的 servlet 的时候可以通过 HttpServletResquest 获取到一些内置对象, 但是在 struts2 中为了方便取得内置对象, 专门提供了一个 ServletActionContext 这个类取得取得内置对象, 观察如下方法 public static javax.servlet.jsp.pagecontext() 取得 pagecontext

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

Microsoft Word - ShkZw3.doc

Microsoft Word - ShkZw3.doc 第 3 章 Struts2 的高级组件 本章将介绍 Struts2 中比较常用的高级组件 通过对这些高级组件的学习, 将有助于进一步了解和使用 Struts2 框架 本章主要内容 : (1)Struts2 对国际化的支持 (2)Struts2 常用拦截器的使用 (3)Struts2 的数据验证功能 (4)Struts2 对文件上传和下载的支持 3.1 Struts2 的国际化 国际化 是指一个应用程序在运行时能够根据客户端请求所来自国家或地区语言的不同而显示不同的用户界面

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

Struts2自定义类型转换.doc

Struts2自定义类型转换.doc Struts2 自定义类型转换 原理 struts2 的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2 已经为我们提供了几乎所有的 primitive 类型以及常用类型 ( 如 Date) 的类型转换器, 我们也可以为我们自定义类添加自定义类型转化器. struts2 为我们提供了一个类型转化器的入口 : ognl.defaulttypeconverter, 或继承 org.apache.struts2.util.strutstypeconverter,

More information

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject(exception, writer.tostring()); mv.setviewname(error); return 本章学习目标 小风 Java 实战系列教程 SpringMVC 异常处理 SpringMVC 文件上传 SpringMVC 处理 JSON 格式数据 SpringMVC 拦截器 SpringMVC 对 restful 风格的支持 1. SpringMVC 异常处理 1.1. @ExceptionHandler 注解处理异常 @ExceptionHandler 该注解使用在异常处理方法上面 1.1.1.

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat 本章学习目标 小风 Java 实战系列教程 AOP 思想概述 AOP 底层技术实现 AOP 术语介绍 SpringAOP 的 XML 方式 HelloWorld SpringAOP 的 XML 方式配置细节 SpringAOP 的注解方式 SpringAOP 的零配置方式 1. AOP 思想概述 1.1. AOP 思想简介 1.2. AOP 的作用 2. AOP 底层技术实现 小风 Java 实战系列教程

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii 前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

untitled

untitled 4.1AOP AOP Aspect-oriented programming AOP 來說 AOP 令 理 Cross-cutting concerns Aspect Weave 理 Spring AOP 來 AOP 念 4.1.1 理 AOP AOP 見 例 來 例 錄 Logging 錄 便 來 例 行 留 錄 import java.util.logging.*; public class HelloSpeaker

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型 文 章 编 号 :1007-757X(2012)1-0036-04 领 域 驱 动 模 型 的 WEB 软 件 系 统 设 计 研 究 摘 要 : J2EE 3 JDK1.7 Tomcat WEB 关 键 词 : 中 图 分 类 号 :TP311 文 献 标 志 码 :A 0 引 言 Web 软 件 系 统 的 分 层 结 构 典 型 的 J2EE 软 件 系 统 开 发 方 法 分 为 三 层 结

More information

Stateless Session Beans(无状态bean)的学习

Stateless Session Beans(无状态bean)的学习 一 Stateless Session Beans( 无状态 bean) 的学习 第一步 : 要定义一个会话 Bean, 首先需要定义一个包含他所有业务方法的接口 这个接口不需要任何注释, 就像普通的 java 接口那样定义 调用 EJB 的客户端通过使用这个接口引用从 EJB 容器得到的会话 Bean 对象 stub 接口的定义如下: HelloWorld.java package com.foshanshop.ejb3;

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

北 风 网 讲 师 原 创 作 品 ---- 仅 供  学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见 北 风 网 讲 师 原 创 作 品 ---- 仅 供 www.ibeifeng.com 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见 者 远 ; 顺 风 而 呼, 声 非 加 疾 也, 而 闻 者 彰 假 舆 马 者, 非 利 足 也,

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) 09 (File Processes) 9-1 9-2 (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) Java Servlet 9-1 Servlet (File Processes) Client Servlet Servlet Java Java (Stream)

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

WebEx 一键集成 1 文档目的 Web 集成 URL API 语法 启会 加会 调用 移动集成 wbx schema 调用 取得 sessionticket...4

WebEx 一键集成 1 文档目的 Web 集成 URL API 语法 启会 加会 调用 移动集成 wbx schema 调用 取得 sessionticket...4 WebEx 一键集成 1 文档目的...1 2 Web 集成...1 2.1 URL API 语法...1 2.2 启会...2 2.3 加会...3 2.4 调用...3 3 移动集成...3 3.1 wbx schema...3 3.2 调用...4 4 取得 sessionticket...4 1 文档目的 本文档目的是, 让用户了解如何在 Web 端和移动端, 一键调用 WebEx app,

More information

Microsoft Word - Learn Objective-C.doc

Microsoft Word - Learn Objective-C.doc Learn Objective C http://cocoadevcentral.com/d/learn_objectivec/ Objective C Objective C Mac C Objective CC C Scott Stevenson [object method]; [object methodwithinput:input]; output = [object methodwithoutput];

More information

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

untitled

untitled 1 行 行 行 行.NET 行 行 類 來 行 行 Thread 類 行 System.Threading 來 類 Thread 類 (1) public Thread(ThreadStart start ); Name 行 IsAlive 行 行狀 Start 行 行 Suspend 行 Resume 行 行 Thread 類 (2) Sleep 行 CurrentThread 行 ThreadStart

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

IoC容器和Dependency Injection模式.doc

IoC容器和Dependency Injection模式.doc IoC Dependency Injection /Martin Fowler / Java Inversion of Control IoC Dependency Injection Service Locator Java J2EE open source J2EE J2EE web PicoContainer Spring Java Java OO.NET service component

More information

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址   access_token=access_token (http 停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 https://webapi.zego.im/cgi/stop-mix? access_token=access_token (https://webapi.zego.im/cgi/stop-mix? access_token=access_token)

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt 2004 Marty Hall 服务器响应的生成 : HTTP 状态代码 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 理解 Struts 框架的工作原理 掌握使用 Struts 框架开发 Web 应用的基本步骤 熟悉 MyEclipse 对 Struts 开发的支持 Web 框架事实标准 : Web 框架的事实标准 http://struts.apache.org Java EE 主流技术趋势图 主流 Web 框架趋势图 使用 Struts 实现加法器 使用开发的

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

Spring3.x开发入门

Spring3.x开发入门 Spring Bean 管理 Spring 的工厂类 课程安排 Spring 的 Bean 管理 (XML 方式 ) Spring 的属性注入 (XML 方式 ) Spring 的 Bean 管理 ( 注解方式 ) Spring 的属性注入 ( 注解方式 ) Spring 的工厂类 Spring 的 Bean 管理 (XML 方式 ) 三种实例化 Bean 的方式 使用类构造器实例化 ( 默认无参数

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

输入 project name 选择完成

输入 project name 选择完成 JAVA 程序访问 HighGo DB 的环境准备 山东瀚高科技有限公司版权所有仅允许不作任何修改的转载和转发 Hibernate 的配置 MyEclipse 中创建新项目 : 选择菜单栏 file---new---project 选择 web project 进行下一步 输入 project name 选择完成 4. 单击 " 添加 JAR/ 文件夹 ", 会如下图出现 JDBC 下载 Hibernate

More information

产品安装文档

产品安装文档 PRIMETON INFORMATION TECHNOLOGIES, INC. 普元信息技术股份有限公司 Primeton ESB6.6 程序员手册 - 拦截器开发手册 普元公司对包括但不限于提供的产品或服务的全部内容及本材料拥有版权等知识产权, 受法律保 护 未经本公司书面许可, 任何单位及个人不得以任何方式或理由对上述产品 服务 信息 材 料的任何部分进行使用 复制 修改 抄录 传播或与其它产品捆绑使用

More information

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch6 [相容模式] UiBinder wzyang@asia.edu.tw UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 掌握 Model I 体系结构 掌握 Model II 体系结构 掌握 MVC 应用程序 Model I 体系结构 6 1 Model I 体系结构结合使用 JSP 页面和 Bean 来开发 Web 应用程序 应用服务器 请求 JSP 页面 响应 Bean 数据库服务器 Model I 体系结构 6 2 Model I 体系结构用于开发简单的应用程序

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

优迈科技教学大纲2009版本

优迈科技教学大纲2009版本 java 软 件 工 程 师 培 训 教 学 大 纲 1 JAVA 软 件 工 程 师 培 训 教 学 大 纲 深 圳 软 件 园 人 才 实 训 基 地 2009 年 3 月 目 录 java 软 件 工 程 师 培 训 教 学 大 纲 2 教 学 阶 段...3 第 一 章 JAVA 起 步...3 第 二 章 面 向 对 象 的 编 程...4 第 三 章 数 据 结 构 IO 线 程 网 络...5

More information

Microsoft Word - PHP7Ch01.docx

Microsoft Word - PHP7Ch01.docx PHP 01 1-6 PHP PHP HTML HTML PHP CSSJavaScript PHP PHP 1-6-1 PHP HTML PHP HTML 1. Notepad++ \ch01\hello.php 01: 02: 03: 04: 05: PHP 06:

More information

resp.getwriter().print(j + "*" + i + "=" + j * i+" "); resp.getwriter().print("<br/>"); protected void dopost(httpservletrequest req, HttpServletRespo

resp.getwriter().print(j + * + i + = + j * i+ ); resp.getwriter().print(<br/>); protected void dopost(httpservletrequest req, HttpServletRespo 第三章补充案例 案例 3-1 HttpServlet 一 案例描述 1 考核知识点名称 :HttpServlet 编号 : 2 练习目标 掌握 HttpServlet 的 doget() 方法和 dopost() 方法 3 需求分析由于大多数 Web 应用都是通过 HTTP 协议和客户端进行交互, 因此, 在 Servlet 接口中, 提供了 一个抽象类 javax.servlet.http.httpservlet,

More information

第一章 章标题-F2 上空24,下空24

第一章 章标题-F2 上空24,下空24 Web 9 XML.NET Web Web Service Web Service Web Service Web Service Web Service ASP.NET Session Application SOAP Web Service 9.1 Web Web.NET Web Service Web SOAP Simple Object Access Protocol 9.1.1 Web Web

More information

《大话设计模式》第一章

《大话设计模式》第一章 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜

More information

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;

More information

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

01_Service

01_Service 移动平台应用软件开发 Service 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一七年 什么是 Service 与 Activity 一样, 同属 Android 基本组件 后台运行, 不与用户交互, 没有可视化界面 最常见的 Service 如 : 在后台播放歌曲 后台执行文件的下载 同样需在 AndroidManifest.xml

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

RUN_PC連載_10_.doc

RUN_PC連載_10_.doc PowerBuilder 8 (10) Jaguar CTS ASP Jaguar CTS PowerDynamo Jaguar CTS Microsoft ASP (Active Server Pages) ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar Server ASP

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

1.1 举例 : 在线用户 我们做一个新手级的在线用户列表, 原理是这样 : 1. 用户登录, 并把登录使用的用户名保存到 session 中, 通过 session 中 是否存在用户名判断用户是否已登录 session 可以在整个会话过程中保存用户信息, 不必每次刷新页面都重新 登录 2. 用户登

1.1 举例 : 在线用户 我们做一个新手级的在线用户列表, 原理是这样 : 1. 用户登录, 并把登录使用的用户名保存到 session 中, 通过 session 中 是否存在用户名判断用户是否已登录 session 可以在整个会话过程中保存用户信息, 不必每次刷新页面都重新 登录 2. 用户登 1.1 举例 : 在线用户 我们做一个新手级的在线用户列表, 原理是这样 : 1. 用户登录, 并把登录使用的用户名保存到 session 中, 通过 session 中 是否存在用户名判断用户是否已登录 session 可以在整个会话过程中保存用户信息, 不必每次刷新页面都重新 登录 2. 用户登录后, 将用户名添加到 application 中的在线用户列表 用 户注销时, 讲用户名从 application

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

Microsoft Word - 第5章.doc

Microsoft Word - 第5章.doc 第 5 章 解密 Struts 之核心文件 在第 4 章中简单介绍了 Java Web 开发的三大框架之一的 Struts 2 框架的一些基本概念及其开发的流程 在 Struts 2 项目开发中, 有一个重要的过程就是其配置文件的配置 本章将介绍 Struts 核心配置文件的具体作用及其配置方式, 然后介绍 Struts 2 框架中的另一种文件 Action 类文件, 本章的主要内容如下 : 配置文件

More information

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466> packages 3-31 PART 3-31 03-03 ASP.NET ASP.N MVC ASP.NET ASP.N MVC 4 ASP.NET ASP.NE MVC Entity Entity Framework Code First 2 TIPS Visual Studio 20NuGetEntity NuGetEntity Framework5.0 CHAPTER 03 59 3-3-1

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

JBuilder Weblogic

JBuilder Weblogic JUnit ( bliu76@yeah.net) < >6 JUnit Java Erich Gamma Kent Beck JUnit JUnit 1 JUnit 1.1 JUnit JUnit java XUnit JUnit 1.2 JUnit JUnit Erich Gamma Kent Beck Erich Gamma Kent Beck XP Extreme Programming CRC

More information

基于ECO的UML模型驱动的数据库应用开发1.doc

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

新美大酒店开放平台SDK(.NET版)使用说明.pages

新美大酒店开放平台SDK(.NET版)使用说明.pages SDK(.NET 版 ) 使 用说明 1 SDK 包说明 1.1 获取 SDK SDK 可以在数据平台下载, 也可直接通过下载地址获得 下载地址 : http://s3.meituan.net/v1/mss_de81c933e113413ea913a772b707b9c9/open-platform-sdk/mthotelopenplatform-sdk-1.0-net.zip 下载成功后, 解压后可获得

More information

JavaIO.PDF

JavaIO.PDF O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 70-536Chinese(C++) Title : TS:MS.NET Framework 2.0-Application Develop Foundation Version : DEMO 1 / 10 1. Exception A. Data B. Message C.

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

RxJava

RxJava RxJava By 侦跃 & @hi 头 hi RxJava 扩展的观察者模式 处 观察者模式 Observable 发出事件 Subscriber 订阅事件 bus.post(new AnswerEvent(42)); @Subscribe public void onanswer(answerevent event) {! }! Observable observable = Observable.create(new

More information

Microsoft Word - D2Z

Microsoft Word - D2Z 第 章 Struts 2 基础 Struts 是 Apache 软件基金会赞助的一个开源项目, 它最初是 Jakarta 项目中的一个子项目 Struts 2 是以 Webwork 设计思想为核心, 吸收原 Struts 的优点而形成的, 旨在帮助程序员更方便地运用 MVC 模式来开发 Java EE 应用 2. 1 Struts 2 框架开发入门 2.1.1 MVC 基本思想 MVC 是一种通用的

More information

06-4.indd

06-4.indd 1 02 07 13 16 20 28 33 38 42 46 48 51 57 64 65 65 66 67 68 2 3 4 5 6 7 8 9 10 11 12 13 LL T : 14 LL T 15 16 扫描电子显微镜成像模拟的 MPI 及 OpenMP 并行化 17 18 19 20 21 22 ~ ~ ~ 23 24 ~ ~ ~ ~ ~ ~ ~ 25 26 27 28 29 图 3

More information

D C 93 2

D C 93 2 D9223468 3C 93 2 Java Java -- Java UML Java API UML MVC Eclipse API JavadocUML Omendo PSPPersonal Software Programming [6] 56 8 2587 56% Java 1 epaper(2005 ) Java C C (function) C (reusability) eat(chess1,

More information

Microsoft Word - json入门.doc

Microsoft Word - json入门.doc Json 入门 送给亲爱的女朋友, 祝她天天快乐 作者 :hlz QQ:81452743 MSN/Email:hulizhong2008@163.com json 入门 (1) json 是 JavaScript Object Notation 的简称 ; 在 web 系统开发中与 AJAX 相结合用的比较多 在 ajax 中数据传输有 2 中方式 : 文本类型, 常用 responsetext 属性类获取

More information

untitled

untitled -JAVA 1. Java IDC 20 20% 5 2005 42.5 JAVA IDC JAVA 60% 70% JAVA 3 5 10 JAVA JAVA JAVA J2EE J2SE J2ME 70% JAVA JAVA 20 1 51 2. JAVA SUN JAVA J2EE J2EE 3. 1. CSTP CSTP 2 51 2. 3. CSTP IT CSTP IT IT CSTP

More information

Microsoft Word - Broker.doc

Microsoft Word - Broker.doc Broker 模式 采用 broker 模式对分布式计算进行简单模拟 系统在一个进程内模拟分布式环境, 因此不涉及网络编程和进程间通信,Broker 通过本地函数调用的方式实现 request 和 response 的转发 采用 broker 模式对分布式计算进行简单的模拟, 要求如下 : 设计四个 server, 一个 server 接收两个整数, 求和并返回结果, 一个 server 接收两个整数,

More information

云数据库 RDS SDK

云数据库 RDS SDK 云数据库 RDS SDK SDK SDK 下载 SDK 下载 最新版本 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip 历史版本 2015-11-3 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip JAVA 教程 JAVA 创建 Access Key 登陆阿里云账号 打开 我的 Access

More information

javaexample-02.pdf

javaexample-02.pdf n e w. s t a t i c s t a t i c 3 1 3 2 p u b l i c p r i v a t e p r o t e c t e d j a v a. l a n g. O b j e c t O b j e c t Rect R e c t x 1 y 1 x 2 y 2 R e c t t o S t r i n g ( ) j a v a. l a n g. O

More information

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 复习 创建对象 构造函数 函数重载 : 函数 = 函数名 + 参数列表 public class MyType { int i; double d; char c; void set(double x)

More information

OSWorkflow Documentation

OSWorkflow Documentation OSWorkflow Documentation Update Time: 05/09/15 OSWorkflow Java workflow engine API 理 flow 行 XML 來 流 Database UI 不 流 GUI Designer end user 行 JSP+Servlet 行 OSWorkflow 2.8 說 2.7 2.7 了 OSWorkflow library library

More information

ebook71-13

ebook71-13 13 I S P Internet 13. 2. 1 k p p p P P P 13. 2. 2 1 3. 2. 3 k p p p 1 3. 2. 4 l i n u x c o n f P P P 13. 2. 5 p p p s e t u p 13. 2. 6 p p p s e t u p P P P 13. 2. 7 1 3. 2. 8 C a l d e r a G U I 13.

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 Struts2 框架是 Apache 开源社区原有的 Struts 框架和 Open Symphony 社区 WebWork2 框架的合并版本, 它集成了这两大流行的 MVC 框架各自的优点, 主要以 WebWork 的设计思想为核心, 提供了更加灵活的控制层和组件实现技术 Struts2 的体系结构 Struts2 的安装与配置 Struts2 框架的主要配置文件 3.1 Struts2

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

07-form

07-form PHP 的输 入 表单与 文件上传杨亮 Web 基本流程 请求 页 面 对应 文件 获取数据 PC Mobile HTTP 请求 html css javascript 服务器 (Apache) (IIS) html css javascript 后端脚本 (PHP) (JSP) (ASP) 数据库 (MySQL) (Oracle) (Access) 返回 页 面 返回 页 面 返回数据 客户端 服务器端

More information

Microsoft Word - 第7章 初识Hibernate—教学大纲.doc

Microsoft Word - 第7章 初识Hibernate—教学大纲.doc SSH 框架整合实战教程 课程教学大纲 ( 课程英文名称 ) 课程编号 : 学分 : 5 学分学时 : 108 学时 ( 其中 : 讲课学时 :76 上机学时 :32) 先修课程 :Java 基础入门 MySQL 数据库入门 JavaWeb 程序开发入门 JavaWeb 程序开发进阶适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 SSH 框架整合实战教程 是面向计算机相关专业的一门专业

More information

关于属性文件的读法

关于属性文件的读法 轻松入门之 Struts2 V3.0 前言 Struts2 其实并不是一个陌生的 Web 框架,Struts2 是以 Webwork 的设计思想为核心, 吸收了 Struts1 的优点, 因此, 可以认为 Struts2 是 Struts1 和 Webwork 结合的产物 Struts2 的使用人群逐渐增多, 它在逐步吸引开发者和用户的目光, 毫无疑问, 大家最终都会选择于它, 困为它确实是一个很优秀的框架

More information

将 MD5 的工具类拷贝到项目中 二 微服务模块的搭建 我们将权限的查询放到一个单独的模块中, 这个模块提供接口供给消费者远程调用 (RPC), 这次范例是微服开发的雏形, 在以后你使用 springcloud 的时候会使用到今天的概念 1 使用 maven 创建新的模块 (microboot-sh

将 MD5 的工具类拷贝到项目中 二 微服务模块的搭建 我们将权限的查询放到一个单独的模块中, 这个模块提供接口供给消费者远程调用 (RPC), 这次范例是微服开发的雏形, 在以后你使用 springcloud 的时候会使用到今天的概念 1 使用 maven 创建新的模块 (microboot-sh Shiro 的环境搭建 一 公共模块的搭建 在实际的开发中, 一个项目可能会分多个模块进行实际的开发, 但是这些模块需要使用一些公 共的操作, 那么这些公共的操作不应该在每个模块中重新定义, 而是将这些公共的操作专门定 义在一个公共的模块之后哦在模块中的 pom 文件里面引入这个公共的模块, 比如说 vo 类就是 一个公共的模块, 所以定义到公共类中 1. 定义公共模块 (microboot-shiro-api)maven

More information