xmlns="xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"xsi:
schemaLocation="
index.jsp
--
用户请求request–>StrutsPrepareAndExecuteFilter–>Interceptor(Struts2内置的一些拦截器或用户自定义拦截器)–>Action(用户编写的action类,类似struts1中的Action)–>Result(类似struts1中的forward)–>JSP/HTML–>向客户端响应Response;StrutsPrepareAndExecuteFilter是Struts2框架的核心控制器,它负责拦截由/*指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。
默认情
况下,如果用户请求的路径不带后缀或以.action结尾,这时请求被转入Strtus2框架处理,否则Strtus2框架将掠过该请求的处理。
当请求转入Struts2框架处理时会先经过一系列的拦截器,然后再到Action.
-->
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
--ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。
-->
org.springframework.web.context.ContextLoaderListener
--如果不配置下面的,默认是/WEB-INF/applicationContext.xml-->
contextConfigLocation
/WEB-INF/applicationContext-*.xml,classpath*:
applicationContext-*.xml
Struts的基本工作流程
i.WEB启动,初始化ActionServlet,读取struts2.xml的配置信息,作准备。
ii.用户发出一个请求,ActionServlet接受,根据ActionMapping查找相应的Action。
iii.Action调用JavaBean,并且结合BeanService处理数据。
iv.处理完成后,返回指定转向的地方。
Spring框架也是一个开源框架,它的核心概念是依赖注入(DependencyInjection),通过依赖注入机制,可以再运行期间将组件之间的依赖关系由Spring容器注入组件,同时spring框架还提供AOP开发以及事务管理的组件,以及对WEB层和持久层的支持,从而可以很好配合Struts2和Hibernate框架。
b)接着struts2.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
--
加载子配置文件Struts2框架的核心配置文件就是struts.xml配置文件,该文件主
要负责管理Struts2框架的业务控制器Action。
在默认情况下,Struts2框架将自
动加载放在WEB-INF/classes路径下的struts.xml文件。
为了避免随着应用规模的
增加,而导致的struts.xml文件过于庞大,臃肿,从而是该文件的可读性下降。
我们
可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。
-->
--定义一个Action名称为addUser,实现类为seehope.demo.web.UserAction.java-->
--任何情况下都转入到/test.jsp-->
/test.jsp
--返回success时,转入到/test.jsp-->
--/test.jsp-->
--通过include元素导入其他元素-->
---->
--Addpackageshere-->
Package配置
Struts2框架使用包来管理Action和拦截器等。
每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
使用package可以将逻辑上相关的一组Action,Result,Intercepter等组件分为一组,Package有些想对象,可以继承其他的Package,也可以被其他package继承,甚至可以定义抽象的Package。
Package的可以使用的属性:
属性是否必须说明
name是Package的表示,为了让其他的package引用
extends否从哪个package集成行为
namespace否参考Namespace配置说明
abstract否定义这个package为抽象的,这个package中不需要定义action
package元素用于定义包配置,每个package元素定义了一个包配置。
定义package元素时可以指定如下几个属性:
name:
必填,指定包的名字,该名字是该包被其他包引用的key。
extends:
可选,指定该包继承其他包。
继承其他包,可以继承其他包中的Action定义、拦截器定义等。
namespace:
可选,定义该包的命名空间。
abstract:
可选,它指定该包是否是一个抽象包。
抽象包不能包含Action定义。
Namespace配置(命名空间配置)
Struts2以命名空间的方式来管理Action,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。
Struts2不支持为单独的Action设置命名空间,而是通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。
Namespace将action分成逻辑上的不同模块,每一个模块有自己独立的前缀。
使用namespace可以有效的避免action重名的冲突,例如每一个package都可以有自己独立的Menu和Helpaction,但是事项方式各有不同。
Struts2标签带有namespace选项,可以根据namespace的不同向服务器提交不同的package的action的请求。
“/”表示根namespace,所有直接在应用程序上下文环境下的请求(Context)都在这个package中查找。
“”表示默认namespace,当所有的namespace中都找不到的时候就在这个namespace中寻找。
c)然后是applicationContext-common.xml
xmlversion="1.0"encoding="UTF-8"?
>
//www.springframework.org/schema/beans"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xmlns:
context="http:
//www.springframework.org/schema/context"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-2.5.xsd
http:
//www.springframework.org/schema/context
http:
//www.springframework.org/schema/context/spring-context-2.5.xsd
">
annotation-config/>
--应用annotation主动注册bean,并保证@Required,@Autowired的属性被注入-->
component-scanbase-package="seehope.demo"/>
--
Spring的框架中为您提供了一个BeanFactoryPostProcessor的实作类别:
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。
藉由这个类别,您可以将一些组态设定,移出至.properties档案中,如此的安排可以
让XML定义档负责系统相关设定,而.properties档可以作为客户根据需求,自定义一些相关的参数。
-->
--定义受环境影响易变的变量-->
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
--标准配置-->
classpath:
jdbc.properties
--数据源配置,应用利用内的DBCP数据库连接池-->
--
class="mons.dbcp.BasicDataSource">
-->
--数据源配置,应用利用服务器的数据库连接池-->
--
jndi-lookupid="dataSource"
jndi-name="java:
comp/env/jdbc/ExampleDB"/>
-->
--Hibernate配置-->
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
org.hibernate.dialect.MySQLDialect
true
true
create
30
--
ming.model.**Class1
ming.model.**Class2
-->
seehope.demo.model
连接数据库的配置文件jdbc.properties,
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:
mysql\:
//localhost\:
3306/demo
jdbc.username=root
jdbc.password=admin
还有log4j.properties(在hibernate开发包里有,这里我就不贴出代码来了,具体路径hibernate-3.x\hibernate-3.x\etc\log4j.properties)
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
还是那句话XX和谷歌是你的老师,去问他们吧。
4)编写代码
代码的编写也是有几层结构的,我也不能很好的详细叙述出来,还是谷歌和XX比较稳固。
我这这里找了几幅图,可以帮助组员了解这几层结构,也是发展过程吧。
Model层:
UserDAO接口:
UserDAOImpl是UserDAO的实现:
UserService接口:
UserServiceImpl是UserService的实现:
Action层:
他们之间的关系,相信通过组员上面的几个结构图和XX、谷歌的搜索可以了解到。
4.测试效果
1)测试首页index.jsp
代码如下:
运行效果图:
2)填写用户名和密码,点击增加用户。
3)解决乱码问题
如果输入的是中文:
出现乱码
解决方法:
首先的步骤,当然是把开发平台,所有的文件以及mysql数据库的编码都设置为统一的编码,这是是utf-8
如果依然有错误,在进行发送请求之前,设置一个filter,过滤所有的信息,所以在web.xml的最前面加上如下代码:
而MyEncodingFilter的代码如下:
在进行插入,运行结果为: