Struts1简单开发流程梳理
共享数据的4种范围
MVC设计模式
JSP model1、JSP model2
struts实现MVC机制(ActionServlet、Action)
struts-config.xml
ActionServlet、ActionForm、Action、ActionMapping、ActionForward
struts应用、servlet容器、jsp容器、Java web容器
struts入门应用:helloapp
1.创建视图组件
hello.jsp、HelloForm Bean
创建jsp文件(导入加载struts标签库)<%@ taglib uri=""%>
输出到网页上的文本内容都是由<bean:message key="hello.jsp.prompt.person"/>标签生成的
<bean:write name="" property=""/>
<html:errors>、<html:form>(html表单字段与ActionFormBean关联)、<html:text>
<logic:present>
2.创建消息资源文件ResourceBundle
<bean:message key="hello.jsp.prompt.person"/>
application.properties(例如:hello.jsp.title=Hello!)
3.创建ActionForm Bean
当用户提交HTML表单之后,struts框架自动把表单数据组装到ActionForm Bean中
ActionForm Bean中的属性和HTML表单中的字段一一对应
先继承ActionForm抽象类比Java bean多了重置默认值reset和数据验证validate方法 ActionErrors
4.数据验证
表单验证(ActionForm Bean中)、业务逻辑验证(Action Bean中)
提交表单后,struts自动把数据组装到ActionForm Bean中,框架调用ActionForm Bean的validate方法进行
表单验证,若返回Action Errors对象为null或者不包含任何ActionMessage对象,就表示没有错误,通过。
struts1.2废弃Action Errors对象,采用ActionMessage
5.创建控制器组件
包括ActionServlet类和Action类
ActionServlet类是struts框架自带的,是整个框架的控制枢纽,通常不需要扩展
Action类是可扩展的,用来处理特定的Http请求(继承Action类)
A.Action类的工作机制
继承Action类,覆盖execute()方法当ActionForm Bean被创建并表单验证通过后,struts框架就会调用Action类
的execute()方法。该方法返回ActionForward对象,该对象包含了请求转发路径信息。
execute方法参数: ActionMapping包含这个Action的配置信息和struts-config.xml文件中的<action>元素对应
ActionForm 包含用户的表单数据(ActionForm数据通过验证才会调用execute方法)
HttpServletRequest
HttpServletResponse
B.访问封装在MessageResources中的本地化文本
Action类中定义了getResources(HttpServletRequest req)方法,返回默认的MessageResources对象,它封装了Resource Bundle中
的文本内容。调用MessageResources对象(已经调用getResources方法返回的对象)messages.getMessage("hello.jsp.title")获取内容
C.业务逻辑验证
Action类的execute方法执行业务逻辑验证(ActionMessages对象的add方法)
(String)((HelloForm)form).getUserName();
Action类自带方法saveErrors(request,errors);<html:errors>
ActionErrors继承ActionMessages
ActionMessages与ActionMessage是聚集关系 1个包含多个
ActionError继承ActionMessage
6.访问模型组件
创建PersonBean对象并调用方法(Action类一般会调用访问模型组件)
7.向视图组件传递数据
Action类把数据存放在request或session范围内,以便向视图组件传递数据
request.setAttribute(Constants.PERSON_KEY,pb);
request.removeAttribute(mapping.getAttribute());
8.把HTTP请求转发给合适的视图组件
Action类把流程转发给合适的视图组件
return mapping.findForward("SayHello"); 返回ActionForward对象
9.创建模型组件JavaBean、EJB
10.创建存放常量的Java文件(request对象setAttribute以及getAttribute需要一个key值)
struts应用提倡将这些属性key常量定义在一个Java文件的Constants.java文件中
public final class Constants{ public static final String PERSON_KEY="personbean";}
使用Constants.PERSON_KEY
11.创建配置文件
创建web应用的配置文件
web.xml对ActionServlet类进行配置
声明web应用使用的Struts标签库(例如:Struts Bean、Struts Html、Struts Logic标签)
创建Struts框架的配置文件 struts-config.xml
<struts-config>、<form-beans>、<form-bean>、<action-mappings>、<action>、<forward>
<message-resources>
分析:<form-bean name="HelloForm" type="hello.HelloForm"/>
配置了一个Action Bean,名为HelloForm 类为hello.HelloForm
<action path="/HelloWord"
type="hello.HelloAction"
name="HelloForm"
scope="request"
validate="true"
input="/hello.jsp"
>
<forward name="SayHello" path="/hello.jsp"/>
</action>
配置Action组件,path请求访问Action路径,type属性指定Action的完整类名,
name指定需要传递给Action的ActionForm Bean,scope指定ActionForm Bean的存放范围
validate指定是否执行表单验证,input指定当表单验证失败时的转发路径
<forward>子元素定义请求转发路径
链接 /sysNotifyTodo.do?method=view 配置文件的action标签parameter="method"
指定调用action哪个方法,此时是view方法
<message-resources parameter="hello.application"/>定义了一个Resource Bundle
parameter属性指定Resource Bundle使用的消息资源文件,此时消息资源文件名为application.properties
存放路径为WEB-INF/classes/hello/application.properties
可以在web.xml或struts.xml配置,其中key属性不是必要的
<message-resources parameter="application" key="local" />
可在页面用struts标签引用资源或在Action类中调用
MessageResources messageResources = this.getResources(request, "local");
String one = messageResources.getMessage("one");
12.发布和运行应用
作为Java Web应用,目录结构应符合Sun公司规范。导包jar文件以及标签库描述文件tld文件。
(页面的链接路径要去掉.do才和struts.xml配置文件的action的path路径属性匹配)
注意一点,如果自定义的ActionClass中重写了excute方法,那么即使指定了method,
所有的请求还是会走excute方法,而不是指定的doAjax方法。
(页面的原生的html标签链接路径前面不需要斜杆/,而struts.xml配置文件需要/)
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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>myweb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>/office/door.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
struts.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config> <!-- 表单 Bean -->
<form-beans>
<form-bean name="door" type="forms.Door" />
</form-beans> <!-- 操作映射 -->
<action-mappings> <action
path="/doors/entrance" type="actions.DoorAction"
parameter="method"
scope="request"
name="door"
validate="true"
input="/error.jsp"> <forward name="welcome"
path="/office/welcome.jsp" />
</action> </action-mappings> <message-resources parameter="application"
key="local" />
</struts-config>
door.jsp文件
<body>
<form action="doors/entrance.do">
门名:<input type="text" name="dname"/>
高度:<input type="text" name="height">
<input type="hidden" name="method" value="myMethod"/>
<input type="submit" value="提交"/>
</form>
</body>
DoorAction.java文件
package actions; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.util.MessageResources; public class DoorAction extends DispatchAction { // @Override
// public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
// HttpServletResponse response) throws Exception {
// System.out.println("door execute action");
// return mapping.findForward("welcome");
// }
public ActionForward myMethod(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("door myMethod action");
String heightstr = request.getParameter("height");
int height = Integer.parseInt(heightstr);
MessageResources messageResources = this.getResources(request, "local");
String one = messageResources.getMessage("one");
String two = messageResources.getMessage("two");
String three = messageResources.getMessage("three");
System.out.println(one+two+three);
if(height>=100){
System.out.println("高度大于等于100!");
}else{
System.out.println("高度小于100!");
}
request.setAttribute("dname", request.getParameter("dname"));
request.setAttribute("height", height);
return mapping.findForward("welcome");
} }
Door.java文件
package forms; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages; public class Door extends ActionForm { /**
*
*/
private static final long serialVersionUID = 8910086866815354113L; private String dname = null;
private String height = null; public String getDname() {
return dname;
} public void setDname(String dname) {
this.dname = dname;
} public String getHeight() {
return height;
} public void setHeight(String height) {
this.height = height;
} @Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
super.reset(mapping, request);
} @Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
System.out.println("validate method!");
System.out.println(dname + ":" + height);
if (dname.trim().equals("") || height.trim().equals("")) {
System.out.println("空!!!");
ActionErrors actionErrors = new ActionErrors();
actionErrors.add("error", new ActionMessage("error", "no!!!") );
// ActionMessages actionMessages = new ActionMessages();
// actionMessages.add("error", new ActionMessage("error", "no!!!"));
// ActionMessage actionMessage = new ActionMessage("error", "no!!!");
return actionErrors;
}
// return super.validate(mapping, request);
return null;
} }
Struts1简单开发流程梳理的更多相关文章
- 微信公众号PHP简单开发流程
原文:微信公众号PHP简单开发流程 微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. ...
- 【Netty】Netty简介及服务器客户端简单开发流程
什么是Netty Netty是一个基于Java NIO的编写客服端服务器的框架,是一个异步事件框架. 官网https://netty.io/ 为什么选择Netty 由于JAVA NIO编写服务器的过程 ...
- drupal 开发简单站点流程
友情推广:Uminicmf 一个基于thinkphp开发的OA框架.http://blog.csdn.net/youmypig/article/details/51727713 drupal 简单站点 ...
- 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破
我在阿里这仨月 Alibaba 试用期是三个月,转眼三个月过去了,也到了转正述职的时间.回想这三个月做过的事情,很多很杂,但还是有重点. 本文谈一谈工作中遇到的各种场景,需要用到的一些前端知识,以及我 ...
- 开发流程习惯的养成—TFS简单使用
才开始用,所以是个很基础的介绍,欢迎大家一起交流学习 一.追本溯源 讲到开发流程,还要从敏捷开始,因为敏捷才有了开发流程的重视,整个流程也是按照敏捷的思想进行的,这里不再叙述敏捷的定义 敏捷的流程(个 ...
- Web开发流程
知乎上关于Web开发流程豪情给予的回答 web前端开发流程是什么?进行操作会用到哪些便捷的小工具?是先用模板做好,然后在基础上改吗??正常大家说的改框架是不是指的用模板做的网站原文件?前端开发做的文件 ...
- 一个WEB应用的开发流程
转载:http://www.51testing.com/html/56/n-3721856.html 先说项目开发过程中团队人员的分工协作. 一.人员安排 毕业至今的大部分项目都是独立完成,虽然也有和 ...
- Android开发经验02:Android 项目开发流程
Android开发完整流程: 一.用户需求分析 用户需求分析占据整个APP开发流程中最重要的一个环节.一款APP开发的成功与否很大程度都决定于此.这里所说的用户需求分析指的是基于用户的要求所进行的 ...
- 1.一个WEB应用的开发流程
先说项目开发过程中团队人员的分工协作. 一.人员安排 毕业至今的大部分项目都是独立完成,虽然也有和其他同事协作的时候,但自认为对团队协作的了解和认知都还有所欠缺.很清楚团队协作的重要性,但尚未有很好的 ...
随机推荐
- linux用户管理(1)----创建用户(adduser和useradd)和删除用户(userdel)
一.常用命令: (1)创建用户命令两条: adduser useradd (2)用户删除命令: userdel 二.两个用户创建命令之间的区别 adduser: 会自动为创建的用户指定主目录.系统sh ...
- c++ 方框中绘制菜单代码
绘制静态菜单 getch与getchar 接收光标控制 一.绘制静态菜单 编写函数void mainmenu( void) 二.getch与getchar getch()的作用是从键盘接收一个字 ...
- kruskal重构树
kruskal重构树 kruskal重构树,顾名思义,是在kruskal的时候顺便搞出来的一棵重构树,具体地说是一个堆. 先说说这个东西是怎么搞出来的吧:默认事先把边按边权从小到大排序,在kruska ...
- 菜鸟vimer成长记——第4.1章、通用插件
简介 关于插件的分类,此系列只会简单的区分为通用插件和编程插件.通用插件的意思是,不基于任何编程语言都可以使用的插件.编程插件,是针对于编程习惯,或者说是针对于某种语言的插件. 计划中,是先把基本常用 ...
- Flutter - 下载别人的Flutter项目,本地编译不过
如果直接下载了别人的Flutter项目,点击运行基本会不通过的,这是gradle版本差异造成的. 你需要修改android/gradle/wrapper/gradle-wrapper.properti ...
- Closure Compiler应用程序使用入门[译]
Hello World示例 Closure Compiler应用程序是一个Java 命令行工具,用来对JavaScript代码进行压缩.优化和排错.按照下面的步骤,用一个简单的JavaScript程序 ...
- 【赛后补题】Lucky Probability(CodeForces 110D)
题意 给定两个\(P,Q\)的正整数区间(\(P,Q\)都符合\([L,R]\)这个区间,并且都\(\le 10^9\)),分别从其中随机选出一个数,选出的两个数作为一个新区间的左右端点.要求新区间内 ...
- 【Unity Shader】(六) ------ 复杂的光照(上)
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Sha ...
- d-ary heap实现一个快速的优先级队列(C#)
d-ary heap简介: d-ary heap 是泛化版本的binary heap(d=2),d-ary heap每个非叶子节点最多有d个孩子结点. d-ary heap拥有如下属性: 类似comp ...
- 关于linux-centos7 安装完成git后npm突然无法使用问题处理
报错: 解决方法: 查看一下nodejs是否安装,如果没有安装的话安装完成就能解决了