【Struts2(一)】Strust2入门XML配置-action编写

Struts2入门第一讲——Struts2框架的快速入门 Struts2框架的概述Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中。目前掌握Struts2框架几乎成为Web开发者的必备技能之一。接下来将针对Struts2的特点、安装以及执行流程等内容进行详细的讲解。什么是Struts2先讲Struts2框架之前,我们得知道JavaEE一共有三层架构,如下: 架构名称 阅读详情

1.1 案例需求

1.1.1 需求概述

CRM系统中有客户的显示的功能,效果如图:

我们实际的开发中会使用Struts2作为Web的架构 

1.2 Struts2的概述

1.2.1 Struts2的概述

Struts是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中。目前掌握Struts框架几乎成为Web开发者的必备技能之一。接下来将针对Struts2的特点、安装以及执行流程等内容进行详细的说明。

1.2.1.1 什么是Struts2

在介绍Struts2之前,先来认识下Struts1。Struts1是最早的基于MVC模式的轻量级Web框架,它能够合理的划分代码结构,并包含验证框架、国际化框架等多种实用工具框架。但是随着技术的进步,Struts1的局限性也越来越多的暴露出来。为了符合更加灵活、高效的开发需求,Struts2框架应运而生。

Struts2是Struts1的下一代产品,是在Struts1和WebWork技术的基础上进行合并后的全新框架(WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架,它也是一个MVC框架)。虽然Struts2的名字与Struts1相似,但其设计思想却有很大不同。实质上,Struts2是以WebWork为核心的,它采用拦截器的机制来处理用户的请求。这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。

Struts2拥有优良的设计和功能,其优势具体如下:

  • 项目开源,使用及拓展方便,天生优势。
  • 提供Exception处理机制
  • Result方式的页面导航,通过Result标签很方便的实现重定向和页面跳转。
  • 通过简单、集中的配置来调度业务类,使得配置和修改都非常容易。
  • 提供简单、统一的表达式语言来访问所有可供访问的数据。
  • 提供标准、强大的验证框架和国际化框架。
  • 提供强大的、可以有效减少页面代码的标签。
  • 提供良好的Ajax支持。
  • 拥有简单的插件,只需放入相应的JAR包,任何人都可以扩展Struts2框架,比如自定义拦截器、自定义结果类型、自定义标签等,为Struts2定制需要的功能,不需要什么特殊配置,并且可以发布给其他人使用。
  • 拥有智能的默认设置,不需要另外进行繁琐的设置。使用默认设置就可以完成大多数项目程序开发所需要的功能。

 Struts2是一个基于MVC设计模式的WEB层框架。

      Struts2的内核相对于Struts1来讲已经发生巨大变化。

上面列举的就是Struts2的一系列技术优势,只需对它们简单了解即可,在学习了后面的知识后,会慢慢对这些技术优势有更好的理解和体会。

那么除了Struts2之外,还有那些优秀的Web层框架呢?

1.2.1.2 常见的web层框架

Struts2

Struts1

Webwork

SpringMVC

Web层框架都会有一个特点,就是基于前端控制器模式实现的。

1.2.1.3 Web层框架基于前端控制器模型设计

什么是前端控制器模式呢?我们来看下图,在图中传统方式的开发,有一次请求就会对应一个Servlet。这样会导致出现很多Servlet。而Struts2将所有的请求都先经过一个前端控制器,在前段控制器中实现框架的部分功能,剩下具体操作要提交到具体的Action中。那么所有的请求都会经过前段控制器,那用什么来实现前端控制器呢?过滤器就是最好的一个实现方式,因为需要所有的请求都可以被过滤器拦截,然后在过滤器中实现部分的功能。所以Struts2的前端控制器也是有过滤器来实现的。

1.2.2 Struts2的入门

1.2.2.1 下载Struts2的开发环境

http://struts.apache.org/

1.2.2.2 解压Struts2开发包

apps          :Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以运行。

docs          :Struts2的开发文档和API

lib              :Strtus2框架的开发的jar包

src             :Struts2的源码

1.2.2.3 创建web项目,引入jar包

首先,需要我们创建一个Web工程,引入相关的jar包文件。引入哪些jar包呢?将struts-2.3.24框架目录中的lib文件夹打开,得到Struts2开发中可能用到的所有JAR包(此版本有107个JAR包)。实际的开发中,我们根本不用引入这么多的jar包。

要进行struts2的基本的开发,可以struts-2.3.24中的apps下的一些示例代码,其中struts2-blank.war是一个struts的空工程。我们只需要将struts2-blank.war解压后进入到WEB-INF下的lib中查看。

struts-blank项目下找jar包

上面这些包就是struts2的基本的开发包了,那么这些包都是什么含义呢?

 

文件名说明
asm-3.3.jar操作Java字节码的类库
asm-commons-3.3.jar提供了基本事件的表现形式
asm-tree-3.3.jar提供了基于对象的表现形式
struts-core-2.3.24.jarStruts2框架的核心类库
xwork-core-2.3.24.jarWebWork核心库,Struts2的构建基础
freemarker-2.3.22.jarStruts2标签模板使用的类库
javassist-3.11.0.GA.jarjavaScript字节码解释器
commons-fileupload-1.3.1.jarStruts2文件上传组件依赖包
commons-io-2.2.jarStruts2的输入输出,传文件依赖的jar
commons-lang-2.4.jar包含一些数据类型工具,是对java.lang包的增强
log4j-api-2.2.jarStruts2的日志管理组件依赖包的api
log4j-core-2.2.jarStruts2的日志管理组件依赖包

 

从表可以看出,此版本的Struts2项目所依赖的基础JAR包共13个。Struts2根据版本的不同所依赖的基础JAR包可能不完全相同,不过基本上变化不大,读者可以视情况而定。

需要注意的是,通常使用Struts2的Web项目并不需要利用到Struts2的全部JAR包,因此没有必要一次将Struts2的lib目录下的全部JAR包复制到Web项目的WEB-INF/lib路径下,而是根据需要,再添加相应的JAR包。

那么Struts2的基本jar包已经引入完成了,我们使用Struts2都是从页面发起请求到服务器,再有服务器处理请求,响应到页面的这个过程。接下来我们就从页面开发进行Struts的开发吧。

1.2.2.4 创建一个JSP页面

首先需要在WebContent下创建一个目录demo1,在demo1下创建一个新的jsp。在jsp中编写一个Action的访问路径。

点击该连接,需要提交请求到服务器的Action。那么接下来需要编写Action去处理请求。 

 1.2.2.5 编写Action的类

在src下创建一个包com.itheima.action,在该包下新建一个HelloAction的类。在这个类中编写一个公有的、返回值为String类型的方法,这个方法叫做execute,且方法没有任何参数。(因为这个方法最终要被反射执行)

Action类编写好了以后,Struts2框架如何识别它就是一个Action呢,那么我们需要对Action类进行配置。

1.2.2.6 对Action进行配置

这个时候,我们还需要观察apps中的示例代码,WEB-INF的classes中,有一个名称为struts.xml的文件,这个文件就是struts2的配置文件。

我们在开发中需要将struts.xml文件引入到工程的src下,因为src下内容发布到web服务器中就是WEB-INF下的classes中。将struts.xml中原有的内容删除掉,然后配置上自己编写的Action类就可以了。

在src下创建(提供)名称叫做struts.xml的配置文件

Action类已经配置好了,配置好了以后大家考虑下,现在是否可以执行呢?其实现在还不行,因为之前我们介绍过,Web层的框架都有一个特点就是基于前端控制器的模式,这个前端控制器是由过滤器实现的,所以我们需要配置Struts的核心过滤器。这个过滤器的名称是StrutsPrepareAndExecuteFilter。 

1.2.2.7 配置前端控制器(核心过滤器)

Struts框架要想执行,所有的请求都需要经过这个前端控制器(核心过滤器),所以需要配置这个核心过滤器。因为这个过滤器完成了框架的部分的功能。那么我们接下来对过滤器进行配置。

web.xml中配置核心过滤器

那么到这,我们程序就可以执行了,但是到了Action以后,页面并没有跳转,只是会在控制台输出Action中的内容,往往我们在实际的开发中,处理了请求以后,还需要进行页面的跳转,如何完成完成Struts2的页面的跳转呢?

这个时候我们需要修改Action类中的execute方法的返回值了,这个方法返回了一个String类型,这个String类型的值就是一个逻辑视图(逻辑视图:相当于对一个真实的页面,取了一个别名。)那么我们来修改一个Action类。 

1.2.2.8 改写Action中的方法的返回值

修改Action中的execute方法的返回值,我们先任意给其返回一个字符串,比如返回一个success的字符串。这个字符串就作为一个逻辑视图名称。

返回一个success的字符串了,这个success的字符串又怎么能代表一个页面呢?这个时候我们又要对struts2进行配置了。这个时候需要修改struts.xml,对Action的配置进行完善。 

1.2.2.9 改写struts.xml

打开struts.xml文件,对<action>标签进行完善,在<action>标签中配置一个<result>标签,这个标签中的name属性就是之前方法返回的那个字符串的逻辑视图名称success。标签内部就是跳转的页面。

1.2.2.10 编写success.jsp

到这儿,我们整个程序就执行完毕了。我们可以启动服务器并且测试项目。 

1.2.3 Struts2的执行流程

1.2.3.1 分析Struts2的执行流程

从客户端发送请求过来,先经过前端控制器(核心过滤器 StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器 就会完成部分功能代码),到底哪些拦截器执行了呢,在Struts2中定义很多拦截器,在其默认栈中的拦截器会得到执行,这个我们可以通过断点调试的方式测试,拦截器执行完成后,就会执行目标Action,在Action中返回一个结果视图,根据Restult的配置进行页面的跳转。

当用户访问某一个Action的时候,先经过核心过滤器,在核心过滤器中执行一组拦截器(这组拦截器实现部分功能),执行目标Action,根据Action的返回值,进行页面跳转。

以上内容是Struts2的执行流程,但是可能大家在编写测试的时候会遇到一些问题,比如在编写XML配置文件的时候没有提示。

1.2.3.2 配置struts.xml中的提示(在不联网的情况下)

开发过程中如果可以上网,struts.xml 会自动缓存 dtd,提供提示功能。如果不能上网,则需要我们手动配置本地dtd,这样才能够使struts.xml产生提示。具体配置方法如下:

1.首先,在eclipse中,依次点击工具栏中的window和下方的preferences弹出对话框。然后在左侧的搜索框中输入xml,显示出所有与xml有关的选项后,点击XML Catalog。

2.接下来在已下载的Struts2解压包的lib包中找到其核心包struts2-core-2.3.24.jar,使用解压工具将其解压成文件夹形式。解压后,我们会看到文件夹中有几个以.dtd结尾的文件。我们所使用的是struts-2.3.dtd。

3.将此dtd使用notepad++等文本打开后,找到图中选中内容,将其http地址复制。

4.点击Eclipse中弹出对话框中右侧的Add按钮,此时会弹出Add XML Catalog Element界面。点击File System按钮,找到本地刚才解压文件夹中的struts-2.3.dtd,然后将界面中的Key type改为URI,并将刚才复制的地址黏贴到Key中。如图所示。 

在图中点击OK后,关闭已打开的struts.xml,然后再重新打开struts.xml,此时再编写struts.xml内容的时候,就会有提示了。 

1.2.4.1 Struts2的配置文件加载顺序

每次从客户端发送请求到服务器都要先经过Struts2的核心过滤器StrutsPrepareAndExecuteFilter,这个过滤器有两个功能:预处理和执行。在预处理中主要就是来加载配置文件的。对应的就是过滤器中的init方法,而执行是用来执行一组拦截器完成部分功能的,对应的是过滤器的doFilter方法。所以我们如果要去了解Struts2的配置文件的加载顺序,那么我们需要查询过滤器的init方法。

 在init方法中,调用了init的initDispatcher的方法来加载配置文件,进入到该代码中:

我们发现这个方法又调用了dispatcher的init方法。进入init方法内部:

  • init_DefaultProperties() ;                           ----加载default.properties
  • init_TraditionalXmlConfigurations();          ----加载struts-default.xml、struts-plugin.xml、struts.xml
  • init_LegacyStrutsProperties();                   ----加载struts.properties
  • init_LegacyStrutsProperties();                   ----加载struts.properties
  • init_CustomConfigurationProviders();       ----加载配置提供类
  • init_FilterInitParameters() ; // [6]             ----加载web.xml中过滤器初始化参数
  • init_AliasStandardObjects() ; // [7]          ----加载Bean对象
  1. default.properties
  2. struts-default.xml
  3. struts-plugin.xml
  4. struts.xml
  5. struts.properties
  6. web.xml

注意:后配置的常量的值会覆盖先配置的常量的值。

1.2.4.2 Action的配置

Struts2框架的核心配置文件是struts.xml文件,该文件主要用来配置Action和请求的对应关系。

<package>相关配置

Struts2框架的核心组件是Action和拦截器,它使用包来管理Action和拦截器。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。在struts.xml文件中,package元素用于定义包配置,每个package元素定义了一个包配置。package元素的常用属性,如表所示。

表中就是package元素的常用属性,其中,在配置包时,必须指定name属性,就是包的标识。除此之外,还可以指定一个可选的extends属性,extends属性值必须是另一个包的name属性值,但该属性值通常都设置为struts-default,这样包中的Action就具有了struts2框架默认的拦截器等功能了。除此之外,struts2还提供了一种所谓的抽象包,抽象包不能包含Action定义。为了显示指定一个包是抽象包,可以为该package元素增加abstract="true"属性。

在package中还有namespace的配置,namespaces属性与action标签的name属性共同决定了访问路径。 

  • package标签称为包,这个包与Java中的包的概念不一致。包为了更好管理action的配置。
  • package标签的属性

            name                 :包的名称,只有在一个项目中不重名即可。

            extends             :继承哪个包,通常值为struts-default。

            namespace       :名称空间,与<action>标签中的name属性共同决定访问路径。

                  名称空间有三种写法:

                         带名称的名称空间                   :namespace=”/aaa”

                         根名称空间                       :namespance=”/”

                         默认名称空间                            :namespace=””

            abstract            :抽象的,用于其他包的继承。

action相关配置

Action映射是框架中的基本“工作单元”。Action映射就是将一个请求的URL映射到一个Action类,当一个请求匹配某个Action名称时,框架就使用这个映射来确定如何处理请求。在struts.xml文件中,通过<action>元素对请求的Action和Action类进行配置。

<action>元素中共有4个属性,这4个属性的说明如下所示。

  • action标签配置Action类。
  • action标签的属性

            name                 :与namespace共同决定访问路径

            class                   :Action类的全路径

            method             :执行Action中的哪个方法的方法名,默认值execute

            converter          :用于设置类型转换器

1.2.4.3 Struts2 常量的配置

Struts2的这些常量大多在默认的配置文件中已经配置好,但根据用户需求的不同,开发的要求也不同,可能需要修改这些常量,修改的方法就是在配置文件对常量进行重新配置。

在Struts2的框架中,提供了非常多的常量:(在default.properties)

  • struts.i18n.encoding=UTF-8                       ----Struts2中所有的post请求的中文乱码不用处理。
  • struts.action.extension=action,,                ----Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。

在Struts2中修改一些常量的值:

  • 修改常量的值,可以有三个位置进行修正

            struts.xml中进行修改

            struts.properties中进行修改

            web.xml中进行修改

1.2.4.4 分模块开发的配置

在实际开发中,我们通常很多人都需要修改同一个配置文件就是struts.xml。因为这个文件是Struts2的核心配置文件。而且这个文件一旦改错了一点,那么会导致整个项目都会出现问题,所以Struts2提供了<include>标签解决这个问题。

<include>元素用来在一个struts.xml配置文件中包含其他的配置文件,包含配置体现的是软件工程中的“分而治之”原则。Struts2允许将一个配置文件分解成多个配置文件,从而提高配置文件的可读性。Struts2默认只加载WEB-INF/classes下的struts.xml文件,但一旦通过多个xml文件来配置Action,就必须通过struts.xml文件来包含其他配置文件。

为了让大家更直观地理解如何在struts.xml文件中进行包含配置,接下来通过一段示例来说明,具体如下:

1.2.5 Struts2的 Action的访问

在struts2的应用开发中,Action作为框架的核心类,实现对用户请求的处理,Action类被称为业务逻辑控制器。一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是说,用户每次请求,都会转到一个相应的Action类里面,由这个Action类进行处理。简而言之,Action就是用来处理一次用户请求的对象。

实现Action控制类共有3种方式,接下来,分别对它们进行讲解,具体如下。

1.2.5.1 Action的编写方式

Action类是POJO的类

在Struts2中,Action可以不继承特殊的类或不实现任何特殊的接口,仅仅是一个POJO。POJO全称Plain Ordinary Java Object(简单的Java对象),只要具有一部分getter/setter方法的那种类,就可以称作POJO。一般在这个POJO类中,要有一个公共的无参构造方法(采用默认的构造方法就可以)和一个execute()方法。定义格式如下:

execute()方法的要求如下:

  • 方法的权限修饰符为public。
  • 返回一个字符串,就是指示的下一个页面的result。
  • 方法没有参数

也就是说,满足上述要求的POJO都可算作是Struts2的Action实现。

通常会让开发者自己编写Action类或者实现Action接口或者继承ActionSupport类。 

Action类实现一个Action的接口

为了让用户开发的Action类更规范,Struts2提供了一个Action接口,用户在实现Action控制类时,可以实现Struts2提供的这个Action接口。

Action接口定义了Struts的Action处理类应该实现的规范,Action接口中的具体代码如下所示。

Action接口位于com.opensymphony.xwork2包中,这个接口里只定义了一个execute()方法,该接口的规范规定了Action处理类应该包含一个execute()方法,该方法返回一个字符串。除此之外,该接口还定义了5个字符串常量,它们的作用是统一execute()方法的返回值。

Action接口中提供了5个已经定义的常量如下:

 

由于Xwork的Action接口简单,为开发者提供的帮助较小,所以在实际开发过程中,Action类很少直接实现Action接口,通常都是从ActionSupport类继承。

Action类继承ActionSupport类(推荐)

ActionSupport类本身实现了Action接口,是Struts2中默认的Action接口的实现类,所以继承ActionSupport就相当于实现了Action接口。ActionSupport类还实现了Validateable、ValidationAware、TextProvider、LocaleProvider和Serializable等接口,来为用户提供更多的功能。

ActionSupport类中提供了许多默认方法,这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等。实际上,ActionSupport类,则会大大简化Action开发。

Action的类已经会编写了,如果要执行这个Action,可以通过前面的配置来完成,但是之前的方式有一个缺点,就是多次请求不能对应同一个Action,因为实际开发中,一个模块的请求通常由一个Action类处理就好了 ,否则会造成Action类过多。

1.2.5.2 Action的访问

Action的访问不是难题,因为之前已经访问过了,但是出现一个问题一次请求现在对应一个Action,那么如果请求很多对应很多个Action 现在要处理的问题就是要让一个模块的操作提交到一个Action中。

其实我们学过在<action>的标签中有一个属性method,通过method的配置来指定Action中的某个方法执行。 

解决Action的访问的问题的方式一:通过配置method属性完成

但是这种方式我们会发现,同一个Action类就被配置了很多次,只是修改了后面的method的值。那么能不能配置简单化呢?也就是一个Action类,只配置一次就好了?这个时候我们就需要使用通配符的配置方式了。

 解决Action的访问的问题的方式二:通过通配符的方式进行配置(*****)

编写Action:

配置Action: 

在<action>的name属性中使用的*代表任意字符,method中的{1}代表name属性中出现的第1个*所代替的字符。

这个时候我们就只配置一个就可以了,在上述代码中,当客户端发送/linkman_save.action 这样的请求时,action元素的name属性就被设置成linkman_save,method属性就被设置成save。当客户端发送/linkman_update.action这样的请求时,action元素的name属性就被设置为linkman_update,method属性也被设置成update。

当然使用通配符是开发中常用的方式,Struts2还有一种解决这类问题的办法,这种大家可以作为扩展内容来学习。 

解决Action的访问的问题的方式三:动态方法访问

 开启动态方法访问

动态方法访问主要在Struts2中默认是不开启的,如果想要使用需要先去开启一个常量。

动态方法访问主要的控制是在页面端,所以编写Action和配置Action都很简单,关键是访问路径的编写。 

编写访问路径

1.3 CRM的客户列表显示

1.3.1 搭建开发环境

1.3.1.1 创建web项目,引入jar包

Struts2

Hibernate

1.3.1.2 引入配置文件

Struts2

      struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- 配置Struts2的常量 -->
	<constant name="struts.action.extension" value="action"/>

</struts>

      web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>struts2_crm</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
   <!-- 配置Struts2的核心过滤器 -->
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

Hibernate

      核心配置 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 连接数据库的基本参数 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///struts2_crm</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">abc</property>
		<!-- 配置Hibernate的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 可选配置================ -->
		<!-- 打印SQL -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化SQL -->
		<property name="hibernate.format_sql">true</property>
		<!-- 自动创建表 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		<!-- 配置C3P0连接池 -->
		<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!--在连接池中可用的数据库连接的最少数目 -->
		<property name="c3p0.min_size">5</property>
		<!--在连接池中所有数据库连接的最大数目  -->
		<property name="c3p0.max_size">20</property>
		<!--设定数据库连接的过期时间,以秒为单位,
		如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
		<property name="c3p0.timeout">120</property>
		 <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
		<property name="c3p0.idle_test_period">3000</property>
		
		<!-- 设置事务隔离级别 -->
		<property name="hibernate.connection.isolation">4</property>
		<!-- 配置当前线程绑定的Session -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- 引入映射 -->
		
	</session-factory>
</hibernate-configuration>

      映射文件

      日志文件 log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout

1.3.1.3 创建数据库和表

CREATE TABLE `cst_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

1.3.1.4 创建包结构

HibernateUtils.java

package com.itheima.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate的工具类
 *
 */
public class HibernateUtils {

	public static final Configuration cfg;
	public static final SessionFactory sf;
	
	static{
		cfg = new Configuration().configure();
		sf = cfg.buildSessionFactory();
	}
	
	public static Session openSession(){
		return sf.openSession();
	}
	
	public static Session getCurrentSession(){
		return sf.getCurrentSession();
	}
}

1.3.1.5 引入相应页面

1.3.2 代码实现

1.3.2.1 修改请求路径

1.3.2.2 编写Action、Service、DAO 

1.3.2.3 配置Action 

1.3.2.4 编写页面,在页面中显示相应的数据

1.3.2.4 测试程序

Java中的Struts是什么?如何使用Struts 因此,Action类是应用程序的核心组件之一,它将用户请求与应用程序逻辑和视图进行交互,并提供灵活性和可扩展性。接下来,您需要在应用程序中配置Struts的XML文件,以指定应用程序的Model,View和Controller。因此,使用Web服务器运行应用程序可以使应用程序更加灵活方便,并提供更多的交互方式,使用户可以更加方便地使用应用程序。综上所述,Struts是一种功能强大,灵活,可靠的Web应用程序框架,可以帮助开发人员更轻松地构建和管理Web应用程序,并保护其免受恶意攻击和错误数据的影响。 阅读详情

相关推荐

Struts2的struts.xml配置详细介绍

解析: constant元素: 配置常量,可以改变Struts 2框架的一些行为 name属性表示常量名称,value属性表示常量值 package元素: 包的作用:简化维护工作,提高重用性 包可以“继承”已定义的包,并可以添加自己包的配置 name属性为必须去且唯一,用于指定包的名称 extends属性指定要扩展的包,一般扩展struts-default包 namespace属性定义该包中action的命名空间(可选) action元素: name属性:映射名称 class:类的完整路径 method:方法名,默认使用的execute()方法 result元素: name属性:默认为succ

常用框架学习(一)——Struts2

1.1  Struts2概述1.1.1  什么是Struts2Struts2是由Apache社区的Struts1和Opensysmphony的Webwork整合而来,Struts负责对http请求的处理,Webwork负责业务逻辑处理。1.1.2 运行环境搭建1.导入13个jar包(在Struts2自带的demo中可以找到最少所需包)2.需要在web.xml文件中配置StrutsPrepareAn...

不忘初心的博客 3万+

scrapy - 美团民宿 实战练习

目录结构 items.py import scrapy # 民俗名称,地区,价格,房间类型及数量,床的数量,可住几人 class MeituanItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() place = scrapy.Field() price = scrapy.F...

小刘的博客 2664

Struts2入门这一篇就够了

前言 这是Strtus的开山篇,主要是引入struts框架…为什么要引入struts,引入struts的好处是什么,以及对Struts2一个简单的入门…. 为什么要引入struts? 既然Servlet能够完成的事,我们为啥要用框架呢?? 框架帮我们封装了很多常用的功能 把Web带过来的参数自动封装到JavaBean中[以前,我们刚开始学的时候是单个单个来获取参数的,后来我们又使用...

3y 3000

使用 Restart Extension 继续解决 Ansys 机械分析

您正在执行复杂或大型的多步有限元分析,突然,您意识到经过数小时的求解后,您需要添加或修改边界条件。在本篇博文中,您将了解如何利用 Ansys Mechanical 中的 RestartAnalysis 扩展来扩展多步分析,方法是合并额外的时间步骤和边界条件,而不会丢失已计算的结果。幸运的是,在 Mechanical 中,有一种直接的方法可以实现这一点,而不会损害您之前的结果,而这在添加新边界条件和使用重新启动点时经常发生。得到的结果符合预期,您可以看到施加的力产生的这两个部分之间的相对位移。

jkh920184196的博客 1232

国产麒麟系统各版本镜像下载

以上各链接均为迅雷下载,禁止商业用途!

2302_79474754的博客 6126

Android Studio中把llama.cpp编译Android .so

本文介绍了一个在Android Studio中集成llama.cpp的最小Demo实现方案,通过JNI将llama.cpp编译为Android.so库,实现本地加载GGUF模型进行文本生成。文章详细说明了项目结构配置(SDK≥30,NDK≥28)、CMake编译设置、Kotlin-JNI-C++的完整调用链实现,以及模型文件部署方式。该Demo采用每次请求新建上下文的简化设计,包含加载模型、生成文本、资源释放等核心功能,并提供了错误排查建议。项目舍弃了上下文保持等复杂功能以确保稳定性,适合作为端侧大语言模型

Zhang Phil 516

Struts2的核心配置之Struts2的常量配置与Action的配置

&nbsp;&nbsp;&nbsp;&nbsp;最近在学习SSH框架,之前Javaweb学的不扎实。所以做好笔记,方便以后的学习。 1. Struts2常量的配置 &nbsp;&nbsp;&nbsp;&nbsp;Struts2常量的配置通常采用3种方式,分别如下: 在struts.xml文件中使用&lt; constant &gt;元素配置常量(最常用的方式); name:该属性指定了常量的常...

YYxiaobao0726的博客 469

剪映自动化工具来了:AI帮你自动剪辑成片

🎬分享一个剪映自动化剪辑工具!AI 自动帮你完成从写文案、配音、加字幕、选音乐、上特效到最终导出的整套流程🎈

XiaoqiangClub的博客 855

Python 爬虫实战:淘宝直播间实时数据抓取(弹幕分析 + 流量监控)

随着电商直播的迅猛发展,淘宝直播已成为品牌推广和商品销售的重要阵地。通过爬取淘宝直播间的实时数据,包括弹幕互动和流量信息,可以帮助商家深入了解用户行为、优化直播策略,同时为市场分析和商业决策提供数据支持。本文将深入探讨如何利用 Python 爬虫技术实现对淘宝直播间实时数据的抓取,并进行弹幕分析和流量监控。

u014481728的博客 730

java struts2作用域_Struts2的配置 struts.xml Action详解

在学习struts的时候,我们一定要掌握struts2的工作原理。只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置。接下来我就先简单的讲解下struts2的框架工作原理:一、struts2的工作原理1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有...

weixin_36344231的博客 259

高级电机控制场景实例:基于Simulink的永磁同步电机基于Luenberger观测器的弱磁控制仿真

本文基于Simulink实现表贴式永磁同步电机(SPMSM)的Luenberger观测器弱磁控制仿真,通过构建“观测-弱磁-控制”协同逻辑,突破传统矢量控制的基速限制。利用线性化模型设计观测器实时估计电流与磁链,结合电压极限约束动态注入负d轴电流,实现转速扩展至12000rpm(4倍基速),弱磁区电流THD低于3%,动态响应时间小于5ms,验证了高速运行下系统稳定性与鲁棒性。附完整建模步骤、MATLAB函数代码及性能分析,适用于电动汽车、机床等高速驱动场景,为高级电机控制提供可复现的技术范式。

amy_mhd的博客 32

Struts2的Action配置及使用

一、Struts配置文件          Struts2默认会加载类加载路径下的struts.xml、struts-default.xml、struts-plugin.xml三类文件,其中struts.xml是开发者定义的默认配置文件,struts-default.xml是Struts2框架自带的配置文件,而struts-plugin.xml则是Struts2插件的默认配置文件。

kakarot5的专栏 3783

【定制功能】LVGL 页面管理

页面管理的主要针对实际复杂的UI项目的。支持多页面管理,包含页面跳转和返回(主要是方便项目功能管理)支持后台页面自动销毁、前台页面自动创建(主要是节约资源使用)支持语言切换逻辑(页面重建功能)支持主题切换逻辑支持页面切换动画效果首先,页面管理是针对act_src图层来讲的。仅在screens数组中供act_src切换的对象树才会被此页面管理功能所管理。这意味着,如果top_layer或者sys_layer图层上,有页面需要重建时,需要特殊处理(实际项目中top_layer或者。

Bigan(安)的博客 5751

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Struts2 XML配置详解

1. 深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置。 1.1. 包配置: Struts2框架中核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。 在struts.xml文件中package元素用于定义包配置,每个package元素定义了一个包配置。它的常用

My Heart Will Go On 631

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Struts2的核心配置

1,配置struts.xml文件 1.1,典型struts.xml: <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">

Code-Dreamer的博客 586

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

struts.xml配置文件详解

package的名字必须是唯一的 package可以扩展 当一个package扩展自           另一个package时该package会在本身配置的基础上加入扩展的package           的配置 父package必须在子package前配置            name:package名称           extends:继承的父package名称           

iamacn的专栏 358

Strust2(一)入门XML配置-action编写

文章目录Struts2的框架的概述什么是Struts2常见的web层框架Web层框架基于前端控制器模型Struts2的入门程序下载Struts2的开发包解压Struts2开发环境创建web项目,引入jar包编写JSP页面编写Action类配置Action类配置核心过滤器改写Action中的方法的返回值改写struts.xml编写success.jspStruts2的执行流程Struts2的常见配置...

最白の白菜的博客 745

struts2 初学(一)最简单的struts2程序

刚开始学习struts2,把学习的过程记录下来。 首先在struts2的官网上下载相应的jar包,初学的话不用考虑太多,下载诸如struts-2.3.20-all.zip即可。 建立一个最简单的struts2的Web工程。在eclipse中新建一个Dynamic Web Project,名字为struts2。 解压刚才下载的struts-2.3.20-all.zip,在解压后的app

lvlvforever的专栏 504

Strust2框架笔记01_XML配置_action编写

文章目录1.Struts2概述1.1 什么是Struts21.2 Web层框架基于前端控制器模型设计2. Struts2入门案例2.1 Struts2的开发环境2.2 解压开发包2.3 创建项目,引入jar包2.4 创建一个JSP页面2.5 编写Action的类2.6 对Action进行配置2.7 配置前端控制器(核心过滤器)2.8 测试2.9 改写Action中的方法的返回值2.10 改写str...

itzhouq的博客 780

深入详解Struts2——struts.xml配置之Action配置详解

配置Action action映射是框架中基本的工作单元,action映射就是将一个请求URI映射到一个action类,当一个请求匹配某个action名字时,框架就使用这个映射来确定如何处理请求。struts.xml文件中的每一个action元素就是一个action映射。 例如:<action name="login" class="org.fyw.struts.action.LoginActi

路漫漫,水迢迢 3080

Struts2初学 struts.xml详解一+Struts2初学 Struts.xml详解二

Struts2初学 struts.xml详解一 Struts2初学 Struts.xml详解二

shenghua 703

struts2_Action的基本使用

Actions是Struts2框架的核心,因为它们适用于任何MVC(Model View Controller)框架。 每个URL映射到特定的action,其提供处理来自用户的请求所需的处理逻辑。 Struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用get和set方法把request中的数据注入。 创建Action类 实现Action接口 // // Sourc...

Onion的博客 2615

一、Strust入门XML配置-action编写

Struts2框架的学习路线   第一天:Struts2的概述、Struts2的入门、Struts2常见的配置、Struts2的Action的编写   第二天:Struts2的数据的封装、结果页面配置   第三天:Struts2的值栈和OGNL表达式   第四天:Struts2的标签库 主要处理你的请求和响应的 三、Struts2的入门 1、下载Stru...

weixin_30727835的博客 206
上一篇: 【计蒜客】字符串长度
下一篇: 【计蒜客】元素移除
红枫忆梦
博客等级 码龄8年 117粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值