struts笔记
mvc 模式
struts 应用,流程
form.
标签
1 strutsmvc 框架
(1)web 应用的分层:
交互层:用来接受请求,收集,表现数据.也就是视图层,通过处理层完成相应的响应.(v,c)
处理层:业务层,完成对数据的处理(m).
(2)mvc 设计模式:应用观察者模式的框架模式
model:模型层,这一层一般是进行数据库访问,并且封装对象,这一层中也存放在访问数据库
取出信息封装成对象的类也就是实体类的信息,可以使用jdbc 或hibernate 实现这一层的功
能.
control:控制层,用来控制请求的响应和调用写好的相应的访问数据库的方法,我们现在用
servlet 来实现这一层,以后会用开源的mvc 框架来实现这层.例如struts.
view:表现层,用来显示数据和收集必要数据,收集数据的一般是form 表单,可以通过
javascript 验证收集的数据是否正确.可以servlet,jsp
好处:解耦合,各司其职,可维护,最大限度可复用性.
(3)mvc 框架的实现模型:2 种
模型一:
jsp+javabean:以页面为核心,jsp 既充当控制,又充当视图,jsp 使用jsp:usebean,不能够实现
不同的页面,显示不同的数据,需要借助于中间类来调用javabean 的方法才能实现.
模型二:
jsp+servlet+javabean:以控制为核心,jsp 只负责收集和显示数据,sevlet 连接视图和模型,将
视图层数据发送给模型层,javabean 分为业务类和数据实体,业务类处理业务数据,数据实体
承载数据.基本上大多数的项目都是使用mvc 这种实现模式.
(4)struts 是使用mvc 的实现模式二来实现的,也就是以控制器为核心。
struts 提供了一些组件使用mvc 开发应用程序:
model:struts 没有提供model 类.这个商业逻辑必须由web 应用程序的开发者以javabean
或ejb 的形式提供
view:struts 提供了actionform 创建form bean,用于在controller 和view 间传输数据.此
外,struts 提供了自定义jsp 标签库,辅助开发者用jsp 创建交互式的以表单为基础的应用程
序.
controller:struts 提供了一个核心的控制器actionservlet,通过这个核心的控制器来调用其
他用户注册了的自定义的控制器action,自定义action 需要符合struts 的自定义action 规范,
还需要在struts-config.xml 的特定配置文件进行配置,接收jsp 输入字段形成actionform,然后
调用一个action 控制器.action 控制器中提供了model 的逻辑接口.
actionform 是可以自动将表单中的数据封装成对象,当然,一个自定义actionform 也是
要遵守struts 规范的,也就是要继承于actionform,并在以上的struts-config.xml 进行配置。
actionform 中有个validate()方法如果空: 正常
如果有错,返回actionerror 对象,跳到哪个页面<action> 中有个属性:input: 转到那个页面
actionerrors: add 方法加actionmessage.
2 基于struts 的web 应用
(1)步骤:环境8 个jar 包
(2)web 应用web.xml,写配置文件struts-config.xml 配置action
//struts-1.2.9-src.zip 文件中的web/examples/web-inf/web.xml 就是样板文件
(3)写自定义的action
web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.actionservlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/web-inf/struts-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
struts-config.xml:
在struts-config.xml 文件中的配置,解析配置文件中,配置文件的action 标签就会被映射成
actionmapping 对象。
<struts-config>
<form-beans>
<form-bean name="xxx" type="actionform 的类全名">
<form-bean name="loginform" type="basic.loginform">
</form-beans>
<action-mappings>
<action path="/basic/login" type="alan.struts.basic.loginaction"
name="xxx" scope="request|session(默认值)">
<forward name="success" path="/basic/success.jsp"/>
<forward name="fail" path="/basic/fail.jsp" redirect="false"(重定向,默认false)/>
</action>
<action path="action 的路径,在form 的action 中写的那个路径" type="action 的类全名">
<forward name="在自定义的action 中使用的findforward 方法的参数" path="跳转页
面的路径"/>
<forward name="xxx" path="xxx/xxx.jsp"/>
</action-mappings>
</struts-config>
自定义action:
action
|
dispatchaction
| |
mappingdispatchaction lookupdispatchaction
dispatchaction 不希望配置文件很长,要传参数
dispatchaction 类的自定义的action 类, 会共享同一的action 路径, 也只能共享一个
actionform,
如果加上校验,会产生form 表单的参数不一致的情况,会导致校验无法通过。
共享同一路径它不知道调哪个方法,所以要传参数.
register.jsp <hidden name="method" value="register" //方法名>
motify.jsp <hidden name="method" value="motify" //方法名>
<action parameter="method"> //隐藏域的名字相对应
dose not hava a handler parameter 异常
使用隐藏域为struts 传递参数要调用自定义action 中方法的方法名,是通过与strutsconfig.
xml 中action 标签中的parameter 和name 属性相对应来获取隐藏域的value。
别去覆盖父类中的execute 方法.
mappingdispatchaction 匹配多个action 路径,不到处传参数,解决共用actoinform 的校验问
题
<action path="/add" type="myaction" parameter="add">
<!--parameter 属性是指定调用方法的名字-->
<forward name="add" path="/add.jsp"/>
<action path="/del" type="myaction" parameter="del">
<forward name="del" path="/del.jsp"/>
在jsp 页面中也不用在使用隐藏域传递参数,直接在form 中的action 中就可以直接使用
xxx.do 匹配了。
<form action="add.do" method="post">
<input type="submit" value="submit"/>
</form>
<form action="del.do" method="post">
lookupdispatchaction: 解决多按钮提交问题
是通过使用资源文件,用submit 按钮的value 来作为资源文件中的key 所对应的值,
通过这个值来找到对用的key,在使用这个key 来获得指定map 中所对应的值,
这个值就是要调用的方法名。
jsp struts-config.xml
dispatchaction 请求参数<action parameter="请求中参数名">
mappingdispatchaction 请求路径<action parameter="action 中的方法名字">
这样写配置文件长
lookupdispatchaction 请求路径getkeymethodmap() <action parameter="页面上按钮的
名字">key=按钮的文本