OA项目概要设计说明书.docx
《OA项目概要设计说明书.docx》由会员分享,可在线阅读,更多相关《OA项目概要设计说明书.docx(19页珍藏版)》请在冰豆网上搜索。
OA项目概要设计说明书
Struts2中的验证逻辑编写在Action中.
Struts2中任何一个POJO都可以是一个Action类.
5、Struts2在页面里使用OGNL来显示各种对象模型
一个请求在Struts2框架中的处理大概分为以下几个步骤
(1)客户端初始化一个指向Web容器的请求。
(2)请求经过一系列过滤器(Filter)的过滤并传递给FilterDispatcher。
(3)FilterDispatcher接收到请求信息后,会根据URL在ActionMapper中搜索指定Action的映射信息。
(4)如果找到符合的映射信息,ActionProxy通过ConfigurationManager在配置文件struts.xml中搜索被请求的Action类。
(5)ActionProxy创建一个被请求Action的实例,该实例用来处理请求信息。
(6)如果在配置文件struts.xml中存在与请求Action相关的拦截器配置,那么该Action的实例被调用的前后,这些拦截器也会先被执行。
(7)Action对请求处理完毕后返回一个逻辑视图,此逻辑视图寻找对应的物理视图,并返回给客户端。
Struts2比较重要的类
org.apache.struts2.dispatcher.Dispatcher
该类有两个作用:
1、初始化
2、调用指定的Action的execute()方法。
org.apache.struts2.dispatcher.FilterDispatcher
这是一个过滤器。
文档中已明确说明,如果没有经验,配置时请将url-pattern的值设成/*。
该类有四个作用:
1、执行Action
2、清理ActionContext,避免内存泄漏
3、处理静态内容(Servingstaticcontent)
4、为请求启动xwork’s的截拦器链。
com.opensymphony.xwork2.ActionProxy
Action的代理接口。
com.opensymphony.xwork2.ctionProxyFactory
生产ActionProxy的工厂。
com.opensymphony.xwork2.ActionInvocation
负责调用Action和截拦器。
com.opensymphony.xwork2.config.providers.XmlConfigurationProvider
负责Struts2的配置文件的解析。
在struts1.x中,struts框架是通过Servlet启动的。
在struts2中,struts框架是通过Filter启动的。
他在web.xml中的配置如下:
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
在web.xml文件中配置Struts2的过滤器
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
--自从Struts2.1.3以后,下面的FilterDispatcher已经标注为过时
org.apache.struts2.dispatcher.FilterDispatcher
-->
struts2
url-pattern>/*
publicclassHelloWorldActionextendsActionSupport{
privateStringmessage;
publicStringgetMessage(){
returnmessage;
}
publicvoidsetMessage(Stringmessage){
this.message=message;
}
publicStringexecute()throwsException{
this.message="我的第一个struts2应用";
return"success";
}
}
/WEB-INF/page/hello.jsp
package:
在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。
在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
name:
配置包时必须指定name属性,如果其他包要继承该包,必须通过该属性进行引用。
extends="struts-default"通常每个包都应该继承struts-default包,struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型。
Struts2很多核心的功能都是通过这些内置的拦截器实现的。
如:
从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。
当包继承了struts-default包才能使用struts2提供的这些功能。
struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。
struts-default.xml也是Struts2默认配置文件。
Struts2每次都会自动加载struts-default.xml文件。
struts2中提供了多种结果类型,如:
dispatcher(默认值内部转发)、redirect(浏览器转发)、redirectAction、plainText(jsp源代码)。
下面是redirectAction结果类型的例子,如果重定向的action中同一个包下:
helloworld
如果重定向的action在别的命名空间下:
helloworld
/test
如果没有指定result的name属性,默认值为success。
在result中还可以使用${属性名}表达式,表达式里的属性名对应action中的属性。
如下:
view.jsp?
id=${id}
通过这种方式,我们就可以将Struts2的Action按模块配置在多个配置文件中
动态方法调用
如果Action中存在多个方法时,我们可以使用!
+方法名调用指定方法
/struts/test/helloworld.action
要访问action的other()方法,我们可以这样调用:
/struts/test/helloworld!
other.action
通常不建议大家使用动态方法调用,我们可以通过常量struts.enable.DynamicMethodInvocation关闭动态方法调用。
Struts2对象获取
方法一,通过ServletActionContext.类直接获取:
方法二,实现指定接口,由struts框架运行时注入
struts2手工编写实现(action中所有方法进行校验)
步骤1、在Action中重写validate()方法
publicvoidvalidate(){
if(this.username==null||"".equals(this.username.trim()))
{
this.addFieldError("username","用户名不能为空");
}
}//自动验证action中的所有方法,验证不通过自动返回“input”视图。
2、在要显示验证不通过的信息的网页上引入struts2标签库
<%@tagliburi="/struts-tags"prefix="s"%>
3、在网页上显示验证不同过的信息
•fielderror>
fielderror>//显示所有的信息
•fielderror>param>username
param>
fielderror>
//显示需要的单个信息
publicvoidvalidateAdd(){
if(username==null&&"".equals(username.trim()))this.addFieldError("username","用户名不能为空");
}
<%@tagliburi="/struts-tags"prefix="s"%>
基于配置校验的举例
4、编写action类PersonAction.java
publicclassPersonActionextendsActionSupport{
privateStringusername;
privateStringmobile;;//省略了set、get方法
publicStringupdate()
{
ActionContext.getContext().put("message","更新成功!
");
return"success";
}
publicStringsave()
{
ActionContext.getContext().put("message","保存成功!
");
return"success";
}
Stringintercept(ActionInvocationinvocation):
执行截拦动作
publicStringintercept(ActionInvocationinvocation)throwsException{
System.out.println("进入拦截器");
ActionContext.getContext().getSession().put("user",getUsername());
ActionContext.getContext().getSession().put("pass",getPassword());
returnSUCCESS;
Objectuser=ActionContext.getContext().getSession().get("user");
if(user!
=null&&user.equals("sunli"))
使用上面的资源文件,在struts.xml中使用常量加载全局资源文件如下:
itclass为资源文件的基本名。
beanname="cn.itcast.bean.Person"var="myperson">
paramname="name"value="%{'zhang'}">
param>
paramname="age"value="34">
param>
bean>
propertyvalue="#myperson.name"/>
Hibernate接口分四类:
1、提供访问数据库的操作的接口:
Session、Transaction、Query接口;
2、用于配置Hibernate的接口
Configruation;
3、回调接口,使用应用程序接受Hibernate内部发生的事件,并做出相关的回应:
Interceptor、Lifecycle、Validatable接口;
4、用于扩展Hibernate的功能的口:
UserType;
其中Hibernate核心接口
1、Configuration接口
作用:
配置Hibernate,启动Hibernate和创建SessionFactory对象;
2、SessionFactory接口
作用:
初始化Hibernate,充当数据存储源的代理,创建Session对象;
3、Seission接口
作用:
负责保存,更新,删除,加载和查询对象;
4、Transaction
作用:
它是hibernate的数据事务接口,对地层的事务接口做了封装,底层事务接口JDBC、API、JTA、CORBAAPI;
5、Query和Criteria接口
作用:
执行数据库查询对象,以及控制执行查询过程;
2.SessionFactory接口
SessionFactory负责创建Session实例,可以通过Configuration实例构建SessionFactory。
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Transaction是Hibernate中进行事务操作的接口
Transactionts=session.beginTransaction();
…
mit();
5.Query接口
Queryquery=session.createQuery("fromKcbwherekch=?
");
例如以下语句:
Queryquery=session.createQuery(“fromKcbwherekch=100”);
在后面设置其值:
query.setString(0,"要设置的值");
上面的方法是通过“?
”来设置参数,还可以用“:
”后跟变量的方法来设置参数,如上例可以改为:
Queryquery=session.createQuery("fromKcbwherekch=:
kchValue");
query.setString("kchValue","要设置的课程号值");
或者:
query.setParameter(0,"要设置的值");
Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。
例如:
Queryquery=session.createQuery("fromKcbwherekch=198");
Listlist=query.list();
xml version='1.0' encoding='UTF-8'?
>
DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"
—JDBC驱动程序-->
com.mysql.jdbc.Driver
-- 连接数据库的URL-->
jdbc:
mysql:
//localhost:
3306/schoolproject
true
UTF-8
--连接的登录名-->
root
--登录密码-->
-- C3P0连接池设定-->
org.hibernate.connection.C3P0ConnectionProvider
20
5
120
100
120
2
--是否将运行期生成的SQL输出到日志以供调试-->
true
--指定连接的语言-->
org.hibernate.dialect.MySQLDialect
--映射Student这个资源-->
Queryquery=session.createQuery(hql);
query.setCacheable(true);//启用查询缓存
query.setCacheRegion(“queryCacheRegion”);//设置查询缓存区域(数据过期策略)
query.list();
HQL查询依赖于Query类,每个Query实例对应一个查询对象。
使用HQL查询可按如下步骤进行:
(1)获取HibernateSession对象;
(2)编写HQL语句;
(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;
(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;
(5)调用Query对象的list等方法遍历查询结果
Queryquery=session.createQuery(
"fromPersonaspwherep.namelike'李%'");
Listusers=query.list();
Hibernate中的关联映射主要有3种:
一对一关联(one-to-one)
一对多(或多对一)关联(many-to-one)
多对多关联。
(many-to-many)
双向关联单向关联
由于Hibernate只是对JDBC进行了轻量级的封装,因此完全可以绕过Hibernate直接调用JDBC进行批量插入。
因此上例可以改成如下代码:
Sessionsession=HibernateSessionFactory.getSession();
Transactionts=session.beginTransaction();
Connectionconn=session.connection();
try{
PreparedStatementstmt=conn.prepareStatement("insertintoKCB(KCH)values(?
)");
for(inti=0;i<500;i++){
stmt.setString(1,i+"");
stmt.addBatch();//添加到批处理命令中
}
stmt.executeBatch();//执行批处理任务
}catch(SQLExceptione){
e.printStackTrace();
}
mit();
HibernateSessionFactory.closeSession();
(2)绕过Hibernate调用JDBC进行批量更新
由于这里是直接操作数据库,故要操作对应表,而不是类。
●Spring是什么
●面向切面编程(AOP---aspectorientedprogramming)
●控制反转(loc):
控制权的转移对象的控制权转交给spring容器。
●建立Spring项目
●
HelloWorld.java
●applicationC