码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2 Learner01

时间:2015-11-07 15:58:19      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

struts2的核心文件
web.xml 只要是mvc都有 Servlet才会被应用加载
对于struts2 需要加载
StrutsPrepareAndExecuterFilter//啊哈 这些都是servlet?
只要外围Web应用负责加载StrutsPrepareAndExecuterFilter,StrutsPrepareAndExecuterFilter将会加载struts2这个框架 遇到.action后缀的请求的话 直接拦截处理

struts.xml
核心配置 Action的隐式 Action对应的Result的定义
包含
1.全局属性
2.用户请求和响应Action之间的对应关系
3.Action可能会用到的参数和返回结果
4.各种拦截器的配置

struts.properties
主要是key-value键值对
该文件完全可以配置是struts.xml文件中

持久层

DAO层

业务层

WEB层

面向配置/切片编程

MVC的核心思想是业务数据抽取同业务数据呈现相分离
model(模型层 业务数据的信息表示 关注支撑业务的信息构成 通常是多个业务实体的组合 java get set)
vide(视图层 为用户提供UI 重点关注数据的呈现 前端设计 JSP html)
control(控制层 调用业务逻辑产生合适的数据(Model) 是视图和模型的沟通 业务逻辑 传递数据给view用于呈现 return "hello";) 有了视图有了模型他们之间的沟通

mvc是一种架构模式
程序分层 分工合作 既相互独立 又协同工作
MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层

DAO层:DAO层主要是做数据持久层的工作(只是封装了基本的数据库元操作)负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置

在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。当那个对象不存在,我还要修改业务的代码,这不符合逻辑

Service层:Service层主要负责业务模块的逻辑应用设计。同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的DAO层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。

Controller层:Controller层负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程,控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。

View层 此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示

DAO层,Service层这两个层次都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势,Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单
DAO层所定义的接口里的方法都大同小异,这是由我们在DAO层对数据库访问的操作来决定的,对数据库的操作,我们基本要用到的就是新增,更新,删除,查询等方法。因而DAO层里面基本上都应该要涵盖这些方法对应的操作。除此之外,可以定义一些自定义的特殊的对数据库访问的方法

Service层是建立在DAO层之上的,建立了DAO层后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法

在DAO层定义的一些方法,在Service层并没有使用,那为什么还要在DAO层进行定义呢?这是由我们定义的需求逻辑所决定的。DAO层的操作 经过抽象后基本上都是通用的,因而我们在定义DAO层的时候可以将相关的方法定义完毕,这样的好处是在对Service进行扩展的时候不需要再对DAO层进行修改,提高了程序的可扩展性

dao一般的设计思路是一个abstract的genericDao和extends这个dao的各种dao

mvc是一种思考方式
需要将什么信息展示给用户看 如何布局 调用哪些业务逻辑
m 需要给用户展示什么 构成我们的模型
v 如何布局 更优雅的展现给用户
c 调用哪些业务逻辑 使得我们可以呈现给用户正确的数据 效率更高 性能更好

都是在src目录下
---HelloWordAction

import com.opensymphony.xwork2.ActionSupport;
public class HelloWordAction extends ActionSupport
{
    @Override
    public String execute() throws Exception
    {
        System.out.println("执行Action");
        return SUCCESS;
    }
}

 


---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">
<!--dtd约束了你这个xml文件可以有哪些标签 不可以有哪些标签-->

<struts>
<!-- include节点是struct2种组件化的方式 可以将每个功能模块独立到一个xml配置文件中-->
<!-- 然后用include节点引用-->
<include file="struts-default.xml"></include>

<!-- package提供了将多个Action组织为一个模块的方式-->
<!--
package(包)可以有多个 名字必须是唯一的 package可以扩展 当一个package扩展自另一个package时
该package会在本身配置的基础上加入扩展的package的配置 父package必须在子package前配置
-->

<!--
name: package名称
extends:继承的父package名称
abstract:设置package的属性为抽象的 臭腺的package不能定义为action 值 true/false
namespace:定义package命名空间 该命名空间影响到url的地址 例如此命名空间为/test 那么访问的地址是
 http://localhost:8080/struts2/test/xx.ateion 如果直接是"/" 那么就直接test去掉 -->
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" class="HelloWordAction">
<!-- result后面可以跟name和type的 默认的话 默认的话是SUCCESS-->
<result>/result.jsp</result>
</action>
</package>

<package name="com.kay.struts2" extends="struts-default" namespace="/text">
<interceptors>
<!--
定义拦截器 可以自己定义
name:拦截器名称
class:拦截器类路径
-->
<interceptor name="timer" class="com.kay.timer"></interceptor>
<interceptor name="logger" class="com.kay.logger"></interceptor>

<!-- 定义拦截器栈 后面会详细说-->
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
</interceptor-stack>

</interceptors>

<!-- 定义的默认拦截器 每个Action都会自动引用这个拦截器 如果Action中引用了其他的拦截器 默认的将无效-->
<default-interceptor-ref name="mystack"></default-interceptor-ref>


<!-- 全局results配置 全局的结果集-->
<global-results>
<!-- 定义好之后 包里所有的Action都可以引用-->
<result name="input">/input.jsp</result>
<result name="error">/error.jsp</result>
</global-results>

<!--
每个包里可以定义多个 Action配置一个Action可以被多次映射(只要action配置中的name不同
name:action名称 http:localhost:8080/projectname/hello.action 就可以访问到下面那个hello

class:对应的类的路径 具体的哪一个action
method:调用Action中的方法 这里可以指定到调用哪个方法
-->
<action name="hello" class="com.kay.structs2.loginAction" method="">
<!--
引用拦截器
name:拦截器名称或拦截器栈名称
-->
<interceptor-ref name="tiemer"></interceptor-ref>
<!--
节点配置
name:result名称和Action中返回的值相同
type:result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher
-->

<result name="success" type="dispatcher">/talk.jsp</result>
<!--
参数设置
name:对应Action中的get/set方法
-->
</action>
<param name="url">http://www.sina.com</param>
</package>

<constant name="struts.i18n.reload" value="true"></constant>
<!-- 在包外面可以定义struts.properties的一些东西-->
</struts>

 

---struts.properties
#指定默认编码集,对于请求参数带有中文的情况应该设置成GBK或GBK2312 默认UTF-8
struts.i18n.encoding=GB2312

#是否每次HTTP请求到达时 都重新加载国际化文件
struts.i18n,reload=true

#当struts.xml改动后,是否加载该文件.在开发阶段建议把这个设置为"ture" 提高开发效率 默认为false
struts.configuration.xml.reload=true

#是否使用struts2的开发模式 可以获得更多的报错信息 便于调试 在开发阶段设置为true 默认为false
struts.devMode=true

#设置游览器是否缓存静态页面 开发阶段设置为false 以获得服务器的最新响应 默认值为true
struts.serve.static.browserCache=true

#指定后缀为.action形式的请求可被多个后缀处理 可配置多个请求后缀 比如.do .struts2等 配置多个后缀名时用逗号隔开
struts.action.extension=action,do,struts2,

#配置服务器运行时的端口号 一般情况下该属性不修改 默认80
struts.url.http.port=8080

 

Struts2 Learner01

标签:

原文地址:http://www.cnblogs.com/taojiatao/p/4945041.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!