Struts1学习笔记总结

合集下载

Struts1学习笔记总结

Struts1学习笔记总结
1设定config参数的作用是设定strutsconfigxml包括了所有的struts的相关请求转发及一些资源设定的文档来源
Struts1学习笔记总结
Struts1 (1)
Struts1和Servlet的关系 (1)
创建第一个Struts1项目 (1)
例子1: (3)
总结重点:struts1的工作流程(基于MVC模式的) (7)
ActionForm和VO的区别:
一样的内容,不一样的作用
ActionForm只接收前台表单传来的数据
VO是conga后台提取的数据向前台传递
创建第一个Struts1项目
新建一个web项目,选择1.4即可
右键----MyEclipse----Add Struts Capacity
---------------Struts控制文件的路径
一.普通的Servlet的工作流程 (7)
二.Structs1的工作流程(和上面的对比记忆) (8)StFra bibliotekuts标签 (9)
Bean标签 (9)
html标签 (10)
logic标签(逻辑标记) (12)
i18n(国际化) (13)
Struts1
Struts1和Servlet的关系
Jsp+Servlet+Javabean
TLD(标签)
1)
2):显示信息
3):逻辑标签
struts-config.xml

Struts笔记

Struts笔记

Struts概念4、struts是一个开源的框架1、为什么有Struts?2、Struts的好处为什么是Web层框架Struts原理手写一个Struts//定义属性【这里有一个规范:就是我们定义属性的时候,//应该和jsp页面的控件属性一样。

如果有人提出疑问:说表单的属性名是不是一定和控件名一样?//只要保证set 和get 方法与属性名存在关联】4.Action5.Filter处理中文乱码public class MyFilter1 extends HttpServlet implements Filter {public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {// TODO Auto-generated method stubarg0.setCharacterEncoding("utf-8");//设置接受的编码arg2.doFilter(arg0, arg1);//}public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub}}<!-- 配置过滤器 --><filter><filter-name>MyFilter1</filter-name><filter-class>com.mhy.filters.MyFilter1</filter-class> </filter><filter-mapping><filter-name>MyFilter1</filter-name><url-pattern>/*</url-pattern></filter-mapping>使用工具开发struts完全使用工具开发5.创建表单截图创建ActionMysqlJava EE 中三种标签标签的选择Struts jstl标签技术为什么有?Jstl标签的好处常用标签引入标签<% taglib %>Java EE 5 Libraries->jstl-1.2.jar->META-INF->c.tld案例讲解c标签c:out标签<%//这句话本应放在控制器中//如果我们的域对象中有相同的属性名,c:out 优先级是pageContext>request>session>applicationrequest.setAttribute("abc","你好1<a href=''>百度</a>") ;//session.setAttribute("abc","你好2") ;//application.setAttribute("abc","你好3") ;//pageContext.setAttribute("abc","你好4") ;User u=new User();u.setName("马海燕");u.setAge(30);request.setAttribute("user",u);%><c:out value="hello world"></c:out><h1>如何输出request/session/application/pageContext域对象的数据</h1><!-- escapeXml 用于指定按照html样式显示,默认为true【表示文本】false【html样式】 --><c:out value="${abc}" default="没有值" escapeXml="false"></c:out><h1>如何输出对象</h1><c:out value="${}"></c:out> ||<c:out value="${user.age}"></c:out><br/>${} @@ ${user.age*20}c:set 标签<body><c:set var="abc" value="你好!" scope="request"></c:set><%//上面的标签等价于//request.setAttribute("abc","你好!");%><c:out value="${abc}"></c:out></body>c:remove<body><%request.setAttribute("a","你好!中国。

struts1学习笔记

struts1学习笔记

struts1开发学习笔记使用一个简单的例子记录struts1开发过程。

0、 描述主要功能描述:index 界面上只有两个超链接,分别可以打开录入产品界面和显示产品列表界面。

newProduct.jsp 是录入的界面,searchProduct.jsp 是查询列表的界面。

ProductAction.java 是处理逻辑的action简单描述流程图:1、 构建环境在Myeclipse 中,新建一个工程StrutsTest ,选择该工程,右键Myeclipse->add srutscapapibality ,弹出界面,选择struts1.2支持。

如下图所示:添加完struts 支持后,lib 目录下会增添struts 的jar 包、增添struts 的配置文件:/WEB-INF/struts-config.xml 、同时在web.xml 中增添了struts 的配置。

2、 代码编写2)创建工具类Util.java,从数据库连接池中获得连接。

需要两个步骤第一步:在WebRoot/META-INF/下新建一个context文件,通过jndi方式配置数据源,第二步:在util类中读取配置获得连接,util.java如下:3)创建工具类EncodingFilter.java,自定义过滤器,并在web.xml中配置,参考web.xml配置中内容。

EncodingFilter.java的内容如下:4)修改web.xml,指定首页为index.jsp。

文件内容如下:最后定义了一个fileld 的过滤器,是用来过滤字符编码的,后面会提到。

6)index.jsp中提到productAction.action?method=viewAddForm,需要在在配置文件中配置了action的实现类,以及作为上传数据时用来保存数据的form:productForm10)searchProduct.jsp是查询结果界面,代码如下:http://localhost:8080/StrutsTest即可访问。

[计算机软件及应用]struts笔记

[计算机软件及应用]struts笔记

Struts学习笔记xml描述数据本身xsl修饰xmlDOMSAXstup 通过协议骨架远程对象典型的proxy代理struts:学j2ee应该朝domain model,FrameWork,Parttern,架构模式方向发展,才能深入了解掌握。

一、Domain Model领域模型:是对现实世界的对象模型是从现实世界抽取出来的一般是先把领域模型设计出来DDD领域驱动设计不像以前,上来先设计数据库,数据库是面向关系的,而java是面向对象的,先面向关系再面向对象,有点别扭ORM自动的把实例类自动转换成数据表实体对象概念,user就是实体概念,有标识值对象概念,属于实体对象的一部分,不是跟数据库的对应二、Parttern模式遇到什么事情用什么方案解决?1、设计模式,GOF设计模式,对象思维,就是把现实中的实体抽象成对象工厂,策略,代理很重要,掌握了设计模式,就有了对象的概念2、架构模式MVC架构模式3、分析模式RBAC(Roles Base Access Control)基于角色的访问控制,对权限设计的处理模型who谁用这些权限what针对哪些资源设计权限how授权给谁,怎么样授权三、FrameWork 框架框架不是一个成熟的产品,是个半成品,struts spring是给开发人员用的,是基础性的服务,就是提供基础组件,封装的是基础性的服务,才可以在各个行业通用。

是大师级的人物写出来的框架,如果我们不用框架,自己就得先写框架,然后再开发具体业务,那就太费时,用框架,我们就只考虑具体业务设计开发,struts就是一个mvc框架。

领域模型对象表现层-业务层-持久层struts spring hibernate以前:jsp -实体bean现在:jsp -采用DTO 或者VO宜于扩展:OCP,只增加相应的实现类,不用修改以前的类两层的一般是:C/S以前大量的存储都用存储过程,不适合跨平台思想B/S:呈现层,业务层,持久层,数据库层可以把界面交给界面组做业务层交给业务开发做数据库交给数据库开发做分层好处,jsp就是显示用的,不参与业务实现,javabean实现业务,分层可以复用,客户端可以是pc,也可以是手机,只是前端采用不同的html,wml实现,业务层不变JDO有收费的也有开源的,但是开源的不太好hibernate 是开源的,用的比较多springstruts 我们用struts1.2是非常经典的mvc框架webwork分析struts的源代码,深入了解mvc在javaProject下建struts目录切换 workspace 到struts建一个test_servlet项目servlet特性:前面必须有“/”<url-pattern>/servlet/TestServlet</url-pattern><url-pattern>/TestServlet</url-pattern><url-pattern>*.action</url-pattern>敲任意字符.action,如果有*了前面不用加“/”<url-pattern>*.do</url-pattern>敲任意字符.do,如果有*了前面不用加“/”<url-pattern>/servlet/*</url-pattern>servlet/后面跟什么都可以访问servlet充当一个控制的角色,mvc中的c角色配置成*.do,通过request.getRequestURI判断请求的user.do,item.do,与配置文件里配置的参数比较,通过策略模式,派发到相应的servlet类(UserServlet,ItemServlet)servlet根据请求转到对应的manager类处理,然后转到实体类,dao层统称为model层,处理的结果转到jsp页面显示MVC:jsp 充当一个显示的界面mvc中的V(view)servlet mvc中的C(control)业务逻辑层 mvc中的M(Model)structs就是实现mvc面向请求的驱动Struts1.x struts2.x webwork面向事件的驱动M2就是MVC模式drp采用的是M1,业务逻辑和表示逻辑混合,jsp充当的角色太重,不适合多于10人开发M2适合大型项目开发,MVC,jsp(v)+servlet(c)+model(m)分层的概念servlet:接受业务参数,调用model层完成操作,然后转到jsp显示结果UserManager就是一个模型,如果UserManager封装的好哪怕改成swing也可以照用,那样才体现分层的思想实体类:贫血模型,vo,pojo设置模型:UserManager就是模型层的概念,增删改查最主要区别:M1没有分层M2是细粒度分层M1适合小型项目开发M2适合大型项目开发M model ,业务逻辑view jsp,显示层,呈现层UI Layercontroller servletswing:也是分层概念,mvc观察者模式tree,model通过浏览器访问某一个servlet接受参数,把参数组织打包,形成用户对象,调用model层处理完成后,返回给servlet层,servlet传递给jsp视图层,返回给浏览器,那样用户可以看到结果。

Struts1[1].X学习笔记

Struts1[1].X学习笔记

Struts基本原理1、Action什么时候初始化?Action请求时初始化,不是在读取配置时初始化。

2、每个Action共用一个实例,只初始化一次,所有请求共享一个action实例。

3、Struts1.2中Action是线程不安全,Struts2线程安全。

4、怎么实现Action的安全性编程?●注意不要用实例变量或类变量共享只是针对某个请求的数据●注意资源操作的同步性。

5、应用:统计action的访问次数。

设计一个实例变量,在调用action时该变量加1。

Integer count = 0;synchronized(count){ // 安全锁count++;}6、ActionForward:Redirect属性:false|no RequestDispatcher.forward跳转(默认)。

ture|yes HttpServletResponse.sendRedirect跳转。

为ture时路为绝对路径,网站外跳转要加协议名。

7、Attribute:用来存取form的关键字,缺省值与name一样8、validate是用于控制是否校验表单,true(缺省值):校验,false:不校验9、input 如果表单验证失败,则跳转到该值指定的位置(容器内跳转)。

Validate为true时才生效。

10、全局跳转:<global-forwards><forward name=”error” path=”/Error.jsp” /></global-forwards>11、ActionForm工作原理1) 检查Action的映射,确定Action中已经配置了对ActionForm的映射。

2)根据name属性,查找form bean的配置信息。

3)检查Action的formbean的使用范围,确定在此范围下(request,sess),是否已经有此formbean的实例4)假如当前范围下,已经存在了些formbean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。

Struts学习笔记

Struts学习笔记

Struts工作原理与核心配置在使用JSP/Servlet时,原理为:JSP→web.xml中配置的servlet与servlet-mapping→Servlet(接收参数,验证,调用DAO操作)→然后跳转不同的页面。

使用Struts时,原理为:JSP→web.xml→ActionServlet(url-pattern:*.do)→struts-config.xml(根据path路径找到对应的Action与ActionForm)→ActionForm→validate方法验证,如果通过进入Action,否则返回input错误页)→Action→调用DAO进行判断→成功时跳转某个页面(Struts-config.xml:forward),失败时可以返回错误页(input)。

Struts-config.xml中的配置组成:所有的<form-bean>都要在<form-beans>里面包含<form-bean>包含两个属性:name:该bean的名称,为唯一标识Type:该bean的包类名。

这是Action的配置Action-mapping中包含多个ActionAction的属性:Name、Attribute表示该Action对应的ActionForm的名称,一个Action 只能对应一个ActionForm,一个ActionForm可以对应多个Action.Input:用来作为错误页的,当validate方法执行后有错误,则自动跳转到该页面。

”/”表示从WebRoot开始寻找页面。

Path:表示该Action的虚拟路径,必须加/,而且不需要加.do的后缀Scope=”request”:表示Action所保存的属性范围。

在Action中可以包含不同的forward路径Forward属性:Name:该forward的唯一标识,在Action中执行跳转时,需要通过该name 查找对应的路径。

Struts1几个知识点

Struts1几个知识点

Struts1几个知识点1:struts1的请求流程答:当视图中有表单提交时,通过表单的action属性传递提交的路径,一般以XXX.do结尾。

(1)当表单提交后容器(tomcat为例)会判断路径是否以.do结尾,如果是则转到中央控制器ActionServlet。

(2)再由web.xml中config找到struts1的struts-config.xml文件,在该文件中的action属性中查找path对应的值是否有前面视图中的请求路径(去掉.do),(3)如果有则判断此action中是否有name属性.(4)有则在struts-config.xml查找<form-beans>中有与name的属性值对应的FormBean类.(5)有则将视图提交的表单中的数据封装到该FormBean类中。

(6)此后在查找该action中是否有attribute键值,有则将封装好的FormBean对象放到以attribute的值为键,以该对象为值的键值对中,请求范围默认为session,但可以通过scope属性设置。

(7)之后,通过该action的type属性找到对应的类,再通过反射得到该类的对象并放到内存中。

(8)执行该类的execute方法,该方法中有四种参数,分别为:ActionMapping,ActionForm,HttpServletRequest,HttpServletResponse,其中ActionMapping对象执行程序运行结束后反向问题,通过findForward(String name)方法去到struts-config.xml 中查找上述action中的forward属性中键name对应的文件,返回到该文件。

该方法中的ActionForm参数对象保存的即为上述经过封装的表单数据。

至此,struts1请求流程完毕。

2:解释为什么用formbean(ActionForm),如何用?答:当通过表单提交数据过多,获取就会变得繁琐和重复,在对应的应用控制器的execute方法中就得多次通过request.getParameter()方法获取表单中的数据。

struts1笔记

struts1笔记

的实例。
public static ActionForm createActionForm(HttpServletRequest request, ActionMapping mapping, ModuleConfig moduleConfig, ActionServlet servlet) {
String attribute = mapping.getAttribute();
LoginForm loginForm=new LoginForm(); loginForm.setUsername("西门崔雪");
Байду номын сангаас
session.setAttribute("loginForm"loginForm)
ActionForm的底层代码
//获取ActionForm实例 -----
//获取ActionForm实例 ----3)检查该表单Bean的使用范围,查找在该范围内,是否已存在该Bean的实例。 如果已经存在,那么就重用该实例。 否则,就重新创建一个。 protected ActionForm processActionForm(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) {
private static ActionForm lookup String attribute, String ActionForm instance = nu HttpSession session = nu
if ("request".equals(sco instance = (ActionFo } else { session = request.ge instance = (ActionFo } return (instance);

Struts1_个人整理笔记

Struts1_个人整理笔记

目标:熟练运用当前流行的java开源框架:Struts、Hibernate以及Spring来构建灵活、易于扩展的多层Web应用程序。

C/S:以数据库为中心B/S:多层架构才是真正的目的B/S多层架构将显示、业务运算、数据库等功能完全分离,杜绝彼此的耦合与影响,从而实现松耦合和良好的可维护性。

✧呈现层(UI Layer/Presentation Layer)⏹Struts✧业务逻辑层(Business Layer)⏹Spring✧持久化层(Persistence Layer)⏹HibernateC/S两层模式,每个客户端需要安装软件,但C/S做的界面灵活性比较好。

何谓两层模式,因为很多业务逻辑都放到了前端(界面里都混了很多业务逻辑),另一方面数据库里有很多存储过程或触发器。

业务逻辑都用存储过程来实现,这是一个弊端Java就不会把业务逻辑放在存储过程里,一般将业务逻辑封装在中间件(java)中。

当然java 有时也会将业务逻辑放在存储过程里,这是从性能上来考虑,因为放在存储过程里,性能肯定会高一些。

B/S 三层模式,客户端通过浏览器来访问,不需要安装软件。

分层就来了,分层带来的影响就是粒度变细了,耦合度变低,复用度就提高了,扩展性能也好了,维护性也好了。

切换工作区间 file-switch Workspace WebRoot-New-other select a wizard MyEclipse-web-JSP(Basic templates)基本模板在Servlet中拿jsp页面的值,使用getParamter()在jsp页面中拿servlet值,使用getAttribute()当在web客户端发送请求时(点击submit),将请求传到web server(tomcat),tomcat负责找到你要请求的servlet(此处为TestServlet),此时servlet做什么呢,首先String userName = req.getParameter("userName");得到表单数据(通过http Request),然后UserManager userManager = new UserManager();调用业务逻辑,当然,业务逻辑方法将表单的值返回給servlet,返回查询结果后,servlet将结果设置到Request里面req.setAttribute("otherList", userList); 把userList设置到属性中,下一个页面才拿得到,接下来servlet会选择视图,将查询结果显示出来。

struts1.x知识点

struts1.x知识点

HTTP->B/S->URL->Tomcat(WEB服务器)->j2ee web-app->javaEE体系->动态网页技术(JSP/SERVLET)web资源JSP Model IJSP Model 2(MVC)Framework自己动手写MVC FrameworkStruts1.x概念:STRUTS是Apache 组织(基金会)Jakarta 项目组的一个开源项目,它采用MVC设计模式,是一个基于Sun J2EE平台的WEB表现层框架。

分层与解耦技术、组件、框架和系统常见WEB表现层框架对比Struts版本1.x 2.x为什么用Struts?Struts入门Struts1.x版HelloWorld(struts-config.xml)Struts结构图MyEclipse中使用Struts开发的步骤:给项目添加Struts支持——.jar.tld,web.xml,struts-config.xml实现业务类(业务模型DAO/DTO)添加S truts组件1、ActionForm2、Action3、编写并配置struts-config.xml4、添加jsp页面调试运行Struts登陆(ActionForm) ,服务器端验证,I18N,HTML标签I18N:1.WEB浏览器向WEB服务器发送请求时,会带上自己的区域和语言2.Struts收到请求后,会找到对应区域和语言版本的属性文件(消息资源文件) 再由key找到value3.我们开发者需要提供不同语言版本的消息资源文件,他们的key要相同!4.在JSP页面上使用国际化的bean标签使用实体对象作为Form Bean属性客户端验证JavaScript服务器端验证ActionFormAction验证框架(会识别正则表达式)1.创建validation.xml2.让自定义的ActionForm继承ValidatorForm3.在struts-config.xml上配置验证插件,使用验证框架4.编写并配置消息资源文件application.properties5. 在JSP页面上显示错误信息Struts工作流程(文字,流程图,源代码)一个用户的请求是通ActionServlet来处理和转发的。

struts1笔记

struts1笔记

沈阅斌StrutsMvc model1Jsp+ javabeanMvc model2Jsp+Servlet+javabeanWeb应用框架JsfM workSpringHibernate……..提供1.分层工作2.改进控制器(Action代替Servlet)a)自动获得客户端提交的参数b)数据类型转换,格式验证c)数据传递和请求转发d)………………3.试图标签库和表达式语言Struts2中mvc的组成:1.模型:Javabean,ejb2.试图:Jsp,…..3.控制器FilterDispatcher,Interceptors(拦截器),ActionsStruts1主控制器ActionServlet 处理*.do结尾的请求|VStruts-config.xml核心配置文件|v业务控制器ActionActionForm(????在struts2里有没有是个争议,把actionform和action合成action了) 模型用来接收客户端提交的参数Struts1的mvc组成1.模型Javabean,ejb,ActionForm2.试图Jsp3.控制器ActionServlet,RequestProcessor,Actions写的东西以前Servlet, jsp, javabean, web.xmlStruts2Action jsp javabean struts.xmlStruts1Action jsp javabean和actionForm struts-config.xml控制器的几个基本的工作1.接收数据Struts2 增加属性和为属性提供setter方法Struts1 提供ActionForm,在ActionForm中属性和getter setter方法2.传递数据Struts2 提供属性,并且把属性保存到属性中,以及为属性提供getter方法Struts1 跟Servlet相同,通过Request传递3.转发请求Struts2 返回字符串,配置Struts1 返回一个ActionForward对象Action元素的属性说明:Path: action的访问路径,以”/”开头Type: action的类型Name: action使用的actionForm的名字.与form-bean元素的name属性取值相同. Scope: action使用的actionform存在的范围,取值为Request或session;Attribute: a ction使用的actionform存在于某个范围内的key.如果不指定此属性,则key为Name属性的值.Validate: action使用的actionform的validate方法是否被调用true为调用,false则不调用Input: struts1框架验证客户端提交的数据格式,如果验证不正确,则把请求转发到此属性所指定的页面上;Forward元素的属性说明:Name: Forward的名字,与mapping.findForward方法传入的值相同.Path: 请求转发的页面路径Redirect: 请求转发方式.,false是服务器内部跳转,true是客户端重定向ActionFormReset 用actionform是把数据恢复到初始状态Getter/setterValidate 验证Struts1的执行流程:1.客户端发送*.do请求,由主控制器接收2.主控制器将请求的处理工作委托给RequestProcessor3.请求处理器根据访问路径寻找一个对应的ActionMapping对象.如果找到,继续执行.找不到则返回404错误.4.根据ActionMapping的信息,查找或者创建一个ActionForm对象.5.请求处理器调用ActionForm对象的reset方法.6.请求处理器调用ActionForm对象的setter方法.7.请求处理器调用ActionForm对象的validate方法.如果返回一个ActionError对象,并且包含错误信息,则将请求转发到action元素input属性指定的页面,反之,继续执行.8.查找或创建一个Action对象.9.调用Action对象的execute方法,执行action.10.请求处理器处理action返回的ActionForward结果.11.响应I18n为一个软件提供多种语言版本.国际化的处理步骤:1.创建资源文件,存放多种语言类型的内容.BaseName_Language.properties简体中文:zh英文:en如:Messages.properties 默认资源文件Messages_zh.propertiesMessage_en.propertiesBaseName相同的叫做同一组资源文件2.注册资源文件<message-resources rameter="com.briup.struts.Message" />3.使用资源文件<bean:message/>4.切换资源文件1)切换浏览器的设置2)要么就在页面上设置一个按钮Native2ascii 源文件目标文件如何确定资源文件?1.如果当前session中存放了Globals.LOCALE_KEY,那么根据session中存放的语言类型寻找一个对应的资源文件.Session.setAttribute(Globals.LOCALE_KEY,Locale.CHINESE);1)访问了struts框架,如果当前session中没有存放语言类型的话,struts框架会把客户端提交上来的语言类型放到session里面.2)通过程序去往session中存放一个语言类型2.如果session里面没有存放语言类型的话,根据客户端的语言类型寻找一个对应的资源文件.Request.getLocale();返回客户端语言类型ActionForm的子类型DynaActionForm: 动态的ActionFormActionDispatchAction: Action的子类解决问题:多个表单提交给同一个action的不同方法处理实现步骤:1.Action类继承DspatchAction,提供多个处理请求的方法.方法名自定义,参数列表和返回类型与execute方法相同.2.在struts-config.xml文件中,指定action元素的parameter属性,这个属性的取值为客户端提交的一个用于表示访问方法的参数名.3.客户端提交请求时,需要提交一个额外的参数,参数名为action元素的paramater属性的值.参数值为action类中的方法名.原理:DispatchAction根据客户端提交的方法名,通过反射机制调用对应的方法.LookupDispatchAction: DispatchAction的子类解决的问题:同一个表单多个提交按钮提交给同一个action的不同方法处理实现步骤:1.Action类继承LookupDispatchAction,实现getKeyMethodMap方法,这个方法返回一个Map,Map中的key为资源文件中的key,Map中的value为action中的方法名.2.描述action的时候指定action元素的paramater属性,其值为提交按钮的名字3.将按钮的值存放到资源文件中,key跟map里面的key一样,value是方法名4.表单提交按钮的值从资源文件获得.5.解决乱码问题原理:客户端提交一个按钮的值,LookupDispatch根据这个值从资源文件中找到一个对应的key,再根据这个key从map中找到一个方法名,然后通过反射调用此方法.MappingDispatchAction: DispatchAction的子类。

Java学习大全 之Struts1

Java学习大全 之Struts1

Java学习大全之Struts11、struts1是轻量级框架,设计思想是MVC。

SSH混用框架中struts1担任视图层。

action为单实例的,线程需要同步。

2、MVC是指模型视图控制器。

3、struts1流程:browser -request-> ActionServlet(根据struts-config.xml配置文件找到action与model层交互) -forward-> jsp -response-> browser4、ActionServlet类:用来控制导航action的。

根据url来决定哪个action被处理。

5、struts1配置文件struts-config.xml需要在WEB-INF目录下的。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "/dtds/struts-config_1_2.dtd"> <struts-config><!--连接数据库级连接池配置,不需要时候可以不写--><data-sources><data-source type="mons.dbcp.BasicDataSource"><set-property property="driverClassName" value="org.postgresql.Driver" /><set-property property="url" value="jdbc:postgresql://localhost/mydatabase" /><set-property property="username" value="me" /><set-property property="password" value="test" /><set-property property="maxActive" value="10" /><set-property property="maxWait" value="5000" /><set-property property="defaultAutoCommit" value="false" /><set-property property="defaultReadOnly" value="false" /><set-property property="validationQuery" value="SELECT COUNT(*) FROM market" /></data-source></data-sources><form-beans><!--表示表单映射,子元素为form-bean--></form-beans><!--不需要时候可以不写--><global-exceptions><!--全局异常,子元素为exception--></global-exceptions><!--不需要时候可以不写--><global-forwards><!--全局异常处理去向,子元素为forward--></global-forwards><action-mappings><!--表示请求映射,子元素为action--></action-mappings><message-resources parameter="com.ApplicationResources" /></struts-config>6、使用流程一、web.xml的配置<servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <!--初始化参数,可以不写,如果不写则加载默认名字的xml文件--> <init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value> </init-param><!--启动服务就实例化ActionServlet,可以不用写--><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>二、写一个action类继承Action抽象类三、写一个actionForm类继承ActionForm抽象类四、在struts-config.xml配置文件添加bean和action7、不使用数据源的例子登录页面index.jsp<body><form action="login.do" method="post">用户名:<input name="username" type="text" /><br/>密码:<input name="password" type="password"/><br/>登录:<input type="submit" value="提交"/></form></body>成功页面success.jsp<body>success跳转<br/>用户名:${ername}<br/>密码:${param.password}<br/></body>LoginForm.java类public class LoginForm extends ActionForm {private String username;//用户名private String password;//密码public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}LoginAction.java类public class LoginAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception { LoginForm lf = (LoginForm) form;System.out.println(lf.getUsername());//后台打印用户输入的用户名System.out.println(lf.getPassword());//后台打印用户输入的密码return mapping.findForward("success");//表示去映射里找到本action的名字为success的forward获得去向,然后跳转。

struts1笔记

struts1笔记

1:学习struts之前首先简单的了解一下struts是什么和为什么使用strutsStruts1是apache软件基金组织jakarta项目的一个子项目,struts的前身是CraigR.McClanahan编写的jsp model2架构。

在所有的MVC框架中,出现最早的应用最广泛的就是struts框架。

它主要是采用servlet和jsp技术来实现的,Struts是基于sun javaee平台的MVC框架,它采用的MVC模式“分离现实逻辑和业务逻辑”的功能发挥的淋漓尽致。

广泛使用struts原因:a:建立在MVC这种公认模式上的。

Struts在M、V、C上都有涉及。

但它主要是提供一个好的控制器和一套定制的标签库上。

(所以具有MVC的一系列优点,如:结构层次分明,高可以重用性、增加了程序的健壮性和伸缩性,便于开发与涉及分工,提供了集中统一的权限控制、校验、国际化、日志等)b:开源项目,得到了包括他的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护,并接受了实战的检验,使其功能越来越大,体系日臻完善。

C:与其他技术和框架具有很好的融合性,如:spring 、hibernate等D:大大提高了开发速度2:struts原理:Model部分:Struts的Model部分由ActionForm和JavaBean组成。

其中ActionForm用于封装用户请求参数,所有的用户请求参数由系统自动封装成ActionForm对象;该对象被ActionServlet 转发给Action;然后Action根据ActionForm离得请求参数处理用户请求。

JavaBean则封装了底层的业务逻辑,包括数据库访问等,在更复杂的应用中JavaBean多代表的并非是一个简单的JavaBean,可能是EJB最贱或其他业务逻辑组件。

(注意:ActionForm并不属于model 层,而是属于控制层)View部分Struts的View部分采用JSP实现。

Struts1.X学习笔记

Struts1.X学习笔记

Struts1.X 学习笔记8月28日2009[在此处键入文档的摘要。

摘要通常是对文档内容的简短总结。

在此处键入文档的摘要。

摘要通常是对文档内容的简短总结。

] MVC框架以及标签的使用Structs1.x 框架工作流程方法介绍Action 是Struct 父接口,其中里面的方法是public ActionForwardexecute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response){}throws ExceptionActionForm 是获取表单中的数据 ActiionForward 是进行转向处理工作流程requestdispatchBrouse (浏览器) ActionServlet (中央控制器) (1. 负责截取url ) (2. 数据的分发dispatch)Struts-config.xmlAction(ActionForm,ActionForward))Model(模型层)业务逻辑forwardJSPresponseStruts Taglib(标签)Struts 标签的配置和使用配置:* 在struts-config.xml文件中加入<message-resources parameter="MessageResources" />* 拷贝MessageResources.properties文件到src下使用:* 采用taglib指令引入<%@ taglib prefix="bean" uri="/tags-bean"%><%@ taglib prefix="logic"uri="/tags-logic"%>Struts 常使用的标签如下:<bean:write name=””>等同于request.getAttribute(“”)/或是request.getPrameatery(“”)<logic:empty> </logic:empty><logic:notEmpty name="attr3"></logic:notEmpty><logic:present></logic:present><logic:notPresent></logic:notPresent>是逻辑判断标记相当于if else JSTL标签的使用(学习的重点,必须掌握)简介:SUN的标准taglib库Jsp标准标签库(jsp standard Tag Library,JSTL)迭代和条件判断数据管理格式化XML操作数据库访问函数标签库表达式语言(EL)El隐式对象存取器运算符EL实例如下:<h1>测试EL表达式</h1><br><hr><li>普通字符串</li><br>hello(jsp脚本):<%=request.getAttribute("hello") %><br>hello(el表达式,el表达式的使用方法$和{}):${hello }<br>hello(el表达式,el的隐含对象pageScope,requestScope,sessionScope,applicationScope,<br> 如果未指定scope,它的搜索顺序为pageScope~applicationScope):${requestScope.hello }<br> hello(el表达式,scope=session):${sessionScope.hello }<br><p><li>结构,采用.进行导航,也称存取器</li><br>姓名:${ername }<br>年龄:${user.age }<br>所属组:${ }<br><p><li>输出map,采用.进行导航,也称存取器</li><br>mapvalue.key1:${mapvalue.key1 }<br>mapvalue.key2:${mapvalue.key2 }<br><p><li>输出数组,采用[]和下标</li><br>strarray[2]:${strarray[1] }<br><p><li>输出对象数组,采用[]和下标</li><br>userarray[3].username:${users[2].username }<br><p><li>输出list,采用[]和下标</li><br>userlist[5].username:${userlist[4].username }<br><p><li>el表达式对运算符的支持</li><br>1+2=${1+2 }<br>10/5=${10/5 }<br>10 div 5=${10 div 5 }<br>10%3=${10 % 3 }<br>10 mod 3=${10 mod 3 }<br><!--==/eq!=/ne</lt>/gt<=/le>=/ge&&/and||/or!/not//div%/mod--><li>测试empty</li><br>value1:${empty value1 }<br>value2:${empty value2 }<br>value3:${empty value3 }<br>value4:${empty value4 }<br>value4:${!empty value4 }<br>JSTL_核心库标签<h1>测试jstl核心库</h1><hr><li>测试c:out</li><br>hello(default):<c:out value="${hello}"/><br>hello(el表达式):${hello }<br>hello(default="123"):<c:out value="${abc}" default="123"/><br>hello(default="123"):<c:out value="${abc}">123</c:out><br>bj(defalut):<c:out value="${bj}"/><br>bj(escapeXml="true"):<c:out value="${bj}" escapeXml="true"/><br> bj(escapeXml="false"):<c:out value="${bj}" escapeXml="false"/><br> bj(el表达式):${bj }<br><p><li>测试c:set和c:remove</li><br><c:set value="123" var="temp"/>temp:${temp }<br><c:remove var="temp"/>temp:${temp }<br><p><li>测试条件控制标签c:if</li><br><c:if test="${v1 lt v2}" var="v">v1小于v2<br>v=${v }<br></c:if><c:if test="${empty v3}">v3为空<br></c:if><c:if test="${empty v4}">v4为空<br><p><li>测试条件控制标签c:choose,c:when,c:otherwise</li><br><c:choose><c:when test="${v1 lt v2}">v1小于v2<br></c:when><c:otherwise>v1大于v2<br></c:otherwise></c:choose><c:choose><c:when test="${empty v4}">v4为空<br></c:when><c:otherwise>v4不为空<br></c:otherwise></c:choose><p><li>测试循环控制标签c:forEach</li><br><table border="1"><tr><td>姓名</td><td>年龄</td><td>所属组</td></tr><c:choose><c:when test="${empty userlist}"><tr><td colspan="3">没有符合条件的数据!</td> </tr></c:when><c:otherwise><c:forEach items="${userlist}" var="u"><tr><td>${ername }</td><td>${u.age }</td><td>${ }</td></tr></c:forEach></c:otherwise></c:choose></table><li>测试循环控制标签c:forEach,varstatus</li><br><table border="1"><tr><td>姓名</td><td>年龄</td><td>所属组</td></tr><c:choose><c:when test="${empty userlist}"><tr><td colspan="3">没有符合条件的数据!</td></tr></c:when><c:otherwise><c:forEach items="${userlist}" var="user" varStatus="vs"><c:choose><c:when test="${vs.count % 2 == 0}"><tr bgcolor="red"></c:when><c:otherwise><tr></c:otherwise></c:choose><td><c:out value="${ername}"/></td><td><c:out value="${user.age}"/></td><td><c:out value="${}"/></td></tr></c:forEach></c:otherwise></c:choose></table><p><li>测试循环控制标签c:forEach,begin,end,step</li><br><table border="1"><tr><td>姓名</td><td>年龄</td><td>所属组</td></tr><c:choose><c:when test="${empty userlist}"><tr><td colspan="3">没有符合条件的数据!</td></tr></c:when><c:otherwise><c:forEach items="${userlist}" var="user" begin="2" end="8" step="2"> <tr><td>${ername}</td><td>${user.age}</td><td>${ }</td></tr></c:forEach></c:otherwise></c:choose></table><p><li>测试循环控制标签c:forEach,普通循环</li><br><c:forEach begin="1" end="10">a<br></c:forEach><p><li>测试循环控制标签c:forEach,输出map</li><br><c:forEach items="${mapvalue}" var="v">${v.key }=${v.value }<br></c:forEach><p><li>测试循环控制标签c:forTokens</li><br><c:forTokens items="${strTokens}" delims="," var="v">${v }<br></c:forTokens><p><li>测试c:catch</li><br><%try {Integer.parseInt("asdfsdf");}catch(Exception e) {out.println(e.getMessage());}%><p><c:catch var="exinfo"><%Integer.parseInt("asdfsdf");%></c:catch>${exinfo }<br><p><li>测试c:import</li><br><c:import url="http://localhost:8080/struts_login"/><p><li>测试c:url和c:param</li><br><c:url value="http://localhost:8080/drp/sysmgr/user_add.jsp" var="v"><c:param name="username" value="Jack"/><c:param name="age" value="20"/></c:url>${v }<br><li>测试:redirect</li><br><c:redirect context="/struts_login" url="/index.jsp"/>Jstl格式化标签的使用实例<li>fmt时间格式化</li><br>date(default):<fmt:formatDate value="${date}" var="d"/><br>d=${d}<br>date(type="time"):<fmt:formatDate value="${date}" type="time"/><br> date(type="date"):<fmt:formatDate value="${date}" type="date"/><br> date(type="both" ):<fmt:formatDate value="${date}"type="both"/><br>date(type="both" dateStyle="long"):<fmt:formatDate value="${date}" type="both"dateStyle="long"/><br>date(type="both" dateStyle="full"):<fmt:formatDate value="${date}" type="both"dateStyle="full"/><br>date(type="both" timeStyle="full"):<fmt:formatDatevalue="${date}" type="both"timeStyle="full"dateStyle="full"/><br>date(type="both" pattern="yyyy-mm-dd hh-mm=ss" ):<fmt:formatDate value="${date}" pattern="yyyy-mm-dd hh-mm-ss"/><li>数字的格式化</li><br>数字的格式化(default):<fmt:formatNumbervalue="${number}"></fmt:formatNumber><br>数字格式化(type="number"):<fmt:formatNumber value="${number}" pattern="###,###.0000"type="number"maxIntegerDigits="10"maxFractionDigits="2"></fmt:formatNumber><br>数字格式化 (type="currency"):<fmt:formatNumber value="${number}" type="currency"var="m"></fmt:formatNumber><br>总共的金额是:${m}<br>百分比(pdate type="percent" ): <fmt:formatDate value="${pdate}"type="percent"var="p"pattern=".0000"/>${p}<br>JSTL函数库(以及自定义函数库)自定义函数的规则jstl_fn自定义函数库:1、定义类和方法(方法必须是public static)2、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下3、在jsp中采用taglib指令引入自定义函数库4、采用前缀+冒号+函数名调用即可实例<h4align="center">jstl函数库的测试</h4><li>和那书库的测试</li><br>hello(jsp 脚本):<%=((String)request.getAttribute("hello")).length() %><br>helo(jstl函数库,函数调用必须在el表达式中前缀+冒号+函数名):${fn:length(hello)}<br>list集合的长度:${fn:length(list) }<li>自定义和那书库的测试</li><br>sayHello(自定义函数):${myfunction:sayhello(name)}动态ActionForm(可以动态的获取页面提交的数据)1、动态ActionForm动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准ActionForm的所有功能* 在struts-config.xml文件中定义动态ActionForm,如:<form-beans><form-bean name="dynaForm"type="org.apache.struts.action.DynaActionForm"><form-property name="username" type="ng.String" /><form-property name="age" type="ng.Integer"/> </form-bean></form-beans>*在Action中使用动态ActionForm,参见DynaActionFormTestAction.java 使用了DynaActionForm累中get的方法DynaActionForm daf = (DynaActionForm)form;String username = (String)daf.get("username");Integer age = (Integer)daf.get("age");注意:DynaActionForm是Struct1.x自带的一个类动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}, 参见:dyna_actionform.jsp动态Action的验证,通常使用动态验证框架validator2、采用struts上传文件* 页面的配置,如:<form action="upload.do" method="post"enctype="multipart/form-data">标题:<input type="text" name="title"><br>文件:<input type="file" name="myfile"><br><input type="submit" value="提交"></form>* ActionForm中使用FormFile来接收上传的文件,参见:UploadActionForm.java * 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传,参见:UploadTestAction.java* 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>3、空字段测试* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串4测试ActionForm类型的自动转换* boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false* Date类型的转换:* 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换* 如果是java.util.Date,默认情况下struts无法转换* 自定义转换器的实现步骤* 实现converter接口,实现convert方法* 将实现的conerter注册,通常情况采用servlet注册* 采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>(也可以采用struts plugin注册)Struts对ActionForm的自动搜集过程:* 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。

struts笔记

struts笔记

Struts是一个开源的web框架,框架提高了程序的规范的同时也约束了程序员的自由为什么会有struts:因为我们对mvc理解的不同,可能造成不同公司写程序的时候,规范不统一,这样不利于程序的维护和扩展,所以我们有必要用一个统一的规范来开发项目(struts)Struts 的好处: 程序更加规范化,开发效率提高了,可读性增加了,程序的可维护性增加了运行原理:一个请求从浏览器发送给web服务器,http://localhost:8080/web 应用/action,web服务器首先解析主机 然后解析web应用的名称 在解析出资源名 转发给总司令ActionServlet(该类由struts框架提供给我们的无需编写,只需配置) ActionServlet有一个文件struts-config.xml,该文件配置了表单actionForm(军火库),还配置了action,以及他们之间的对应关系,当ActionServlet拿到命令后它会查询struts-config.xm l文件去填充数据,把用户的数据填充到表单里边, 下个动作就是去调用指定的action(小队长),action去从表单中读取数据, 调用某个model(士兵,如service)完成任务, 完成任务把结果返回给ActionServlet总司令(返回一个执行的结果),-->总司令又去查询struts-config.xml文件,决定跳转到哪个jsp页面, 返回一个执行结果(形成静态html文件) 直接返回给web服务器 服务器再把静态页面以http响应给浏览器,登录小项目过程步骤: 新建web工程 导入struts包 编写login.jsp 编写actionForm和action 配置struts-config.xml 编写ok.jsp和err.jsp 配置web.xml 测试Struts.config.xml中的<action>中的scope指的是actionform的生命周期范围 struts中<action>的scope默认是session配置过滤器public class MyFilter extends HttpServlet implements Filter {@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {arg0.setCharacterEncoding("gb2312");arg1.setCharacterEncoding("gb2312");arg2.doFilter(arg0, arg1);}配置web.xml<filter><filter-name>MyFilter</filter-name><filter-class>com.chao98.services.MyFilter</filter-class></filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>上面这次比较浪费资源每次都要去实例化但是下面这种过滤器不太彻底,往数据库里插入数据时还是会经常出现乱码public class MyFilter extends HttpServlet implements Filter {private String encoding;public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// arg0.setCharacterEncoding("gb2312");//arg1.setCharacterEncoding("gb2312");arg0.setCharacterEncoding(encoding);arg2.doFilter(arg0, arg1);}public void init(FilterConfig arg0) throws ServletException {encoding=arg0.getInitParameter("encoding");}然后在web.xml中加入<init-param><param-name>encoding</param-name><param-value>GB2312</param-value></init-param>配置struts-config.xml<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servle t-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</param-value></init-param><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping>写一个关于安全性的过滤器,用于过滤一些用户注册使用的关键字private String keywords[];public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {Stringusername=arg0.getParameter("username");System.out.println("this is safe filter !");System.out.println(username);if(username!=null){for(String key:keywords){if(key.equals(username)){arg0.setAttribute("err", username+"被第二个管理安全的过滤器拦截了");arg0.getRequestDispatcher("/WEB-INF/tishi.jsp").forward(arg0, arg1);return ;}}}arg2.doFilter(arg0, arg1);}public void init(FilterConfig arg0) throws ServletException {keywords=arg0.getInitParameter("keywords").split(";");}然后在web.xml配置过滤器还有设置要过滤的关键字<init-param><param-name>keywords</param-name><param-value>xiaomao;xiaoxiao</param-value></init-param>每个action是单态的,包括actionserver,对网站并发性有影响若要证明的话在***action.java中声明一个静态变量,每次访问自加什么是单态: 单态是指在整个运行过程中,始终是一个对象;struts-config.xml默认放在WEB-INF目录下,也可以放到其他地方,只需要在web.xml中的<init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param>有多个struts-config.xml只需用","号隔开java 中插入数据库的语句需要注意标点st.executeUpdate("insert into user(username,password) values("+"'"+u.getUsername()+"'"+","+"'"+u.getPassword()+"'"+ ")");jstl(jsp startand tag liblary) jsp标准标签库: 可以提高开发速度,代码简洁升级jsp 页面<!DOCTYPE HTML PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">替换8.5myeclipse:D:\Program\Files\Myeclipse\Common\plugins\com.genuitec.eclips e.wizards_8.5.0.me201003052220.jar\templates\jsp\jsp.vtl的6.5myeclipse:D:\ProgramFiles\MyEclipse6.5\myeclipse\eclipse\p lugins\com.genuitec.eclipse.wizards_6.5.0.zmyeclipse650200806 \templates\jsp<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> 这样比较符合现在的开发潮流各个jstl标签<c:out>:<c:out value="hello world"></c:out><c:out value="${username}" default="没有值" escapeXml="false" ></c:out>等同于request.getAttribute("user").toString();escapeXml表示是否安装html样式显示默认是true:表示以文本显示如何输出request,session,application, pageContext域对象的数据<%request.setAttribute("hello","request你好!");session.setAttribute("hello","session你好!");application.setAttribute("hello","application你好");pageContext.setAttribute("hello","pageContext你们<ahref=''>百度</a>");%>这里有个优先级的问题,pageContext>request>session>application<c:out value="${hello}" default="没有值" escapeXml="false" >如果是在同一个页面,那么这段代码输出pageContext你们好百度<%User u=new User();u.setUsername("admin");u.setPassword("admin");request.setAttribute("user",u);%><c:out value="${ername}"></c:out>| |<c:out value="${user.password}"></c:out>相当于(User) request.setAttribute("user").getUsername();<c:set>:<c:set var="abc"value="中国,北京"scope="request"></c:set><c:out value="${abc}"/><c:remove var="abc"/> 移除之后中国北京将不再显示<c:catch>:<c:catch var="err"><%int i=3/0; %></c:catch><c:out value="${err.message}"></c:out><c:if test="${2<30?true:false}">ok</c:if><c:if>:<%request.setAttribute("a","hello");request.setAttribute("age","22"); %>判断字符串:<c:if test="${a=='hello'}">hello</c:if>判断数值<c:if test="${age>12 and age<30 or age==22}"> 年龄大于12 小于30 ${age }</c:if> <%ArrayList<User> al=new ArrayList<User>();User u1=new User();u1.setUsername("陈超");u1.setPassword("tiger");User u2=new User();u2.setUsername("system");u2.setPassword("manager");al.add(u1); al.add(u2);request.setAttribute("alluser",al);%><c:forEach items="${alluser}" var="u">${ername}${u.password} <br/></c:forEach>第一种迭代<c:forEach var="i" begin="1" end="10">${i}&nbsp;&nbsp;</c:forEach><br/>第二种迭代<c:forEach var="i" begin="1" end="10" step="3">${i}&nbsp;&nbsp;</c:forEach><br />用于分隔字符:<c:forTokens items="11;33;44;52;" delims=";" var="temp">${temp}</c:forTokens>什么时候用$符,什么时候不用$如果是从某个域对象中取出值,取的是一个变量就要用$ ,取的是一个固定的值就不要$第一种:Window.open(); 这种方式比较慢第二种:window.location.href=”/web应用名/goManager?pageNow=”+pageNow<c:if test="${pageNow>1}">前一页:<a href=”/web应用名/goManager?pageNow=${pageNow-1}”></c:if>当前页:<c:forEach><a href="/web应用名/gotoManage?pageNow=${i}">[${i }]</a></c:forEach><c:if test="${pageNow<pageCount}">后一页:<a href=”/web应用名/goManager?pageNow=${pageNow+1}”></c:if>当前页${pageNow } /总页数${pageCount } 跳转到<input type="button" id="pageNow" name="pageNow" value="跳"/><%Map map=new HashMap();//map.put("aa","admin");// map.put("bb","scott");User u1=new User();u1.setUsername("xiaoming");u1.setPassword("xiaoming");User u2=new User();u2.setUsername("xiaoming");u2.setPassword("xiaoming");map.put("u1",u1);map.put("u2",u2);request.setAttribute("person",map);%><c:forEach items="${person}" var="per">key:${per.key }值name: ${ername }值password:${per.value.password }<br/></c:forEach><%Set set=new HashSet();User u3=new User();u3.setUsername("scott");u3.setPassword("tiger");set.add(u3);request.setAttribute("setuser" ,set);%><c:forEach items="${setuser}" var="myusers">值name: ${ername }值password:${myusers.password }<br/><c:if test="${!empty setuser}">有人</c:if></c:forEach>重定向:<c:redirect url=""/>import标签:<c:import url="a.jsp"><c:param name="name" value="admin"/></c:import>Strtus标签:<html:base ref=""/><a href="#">goto</a>如果没有给超链接设置则默认跳到百度(如上)<html:image src="images/chadu.png"></html:image>这是一个图片按钮<html:img src="images/chadu.png"/>这是真真正正的一i张图片bean标签: 用于输出信息<%User u1=new User();u1.setUsername("admin");u1.setPassword("admin");request.setAttribute("user",u1);%><bean:write name="user" property="username"></bean:write>另外还有两种创建bean的方法,但是用的不多<bean:define id=""/></bean:define><jsp:useBean id="u2" class="er"></jsp:useBean><jsp:setProperty name="u2" property="username" value="chenchao"/>Logic 标签:logic标签使用<%User u1=new User();u1.setUsername("admin");u1.setPassword("aa");User u2=new User();u2.setUsername("tiger");u2.setPassword("ac");User u3=new User();u3.setUsername("scott");u3.setPassword("ab");ArrayList<User> al=new ArrayList<User>();al.add(u1);al.add(u2);al.add(u3);request.setAttribute("users",al);%><logic:iterate id="user" name="users"><bean:write name="user" property="username"/><bean:write name="user" property="password"/><br/></logic:iterate><logic:empty name="ee">属性不存在</logic:empty><logic:notEmpty name="users">users属性存在</logic:notEmpty><logic:iterate id="myusers" name="users"><logic:greaterThan value="20" property="age" name="myusers"> 年龄大于二十</logic:greaterThan></logic:iterate>标签的选择: 通常会选择el表达式$op Struts 第23讲: 开发struts 的用户管理系统Create table users (Id int primary key,Name varchar(20) not null,Pwd varchar(30) not null,Email varchar(30) not null,Tel varchar(30) not null,Grade int default 1 not null)如果中文不能加入的话 show variables like ‘%char%’;Set character_set_client=gbk注销退出登录request.getSession().invalidate(); //会把所有的session都删除return mapping.findForward("logout");动态表单(dynimic form):当我们表单个数和类型不确定的情况下,我们就可以使用动动态表单来解决动态表单和普通表单的区别:1普通表单actionForm 是首先你需要定义这样一个类,然后配置到struts-config中,2,动态表单完全依赖反射机制创建,所以不要去定义表单类,直接在struts-config.xml中配置即可<form-bean name=”userForm”type=”org.apache.struts.action.DynaActionForm”><form-property name=”username” type=”ng.String/></form-bean>文件的上传与下载读取文件(inputStream)写文件(outputStream);案例项目:1:<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/register.do" method="post">name:<input type="text" name="username"/><br/>photo:<input type="file" name="myphoto"/><br/><input type="submit" value="regist" /></form>2:public class UserForm extends ActionForm {private String username;private FormFile myphoto;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public FormFile getMyphoto() {return myphoto;}public void setMyphoto(FormFile myphoto) {this.myphoto = myphoto;}3:public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {UserForm userForm=(UserForm)form;String username=userForm.getUsername();//取出用户名字FormFile formFile=userForm.getMyphoto();// 通过FormFile 我们可以获取关于上次文件的各种信息String fileName=formFile.getFileName();int fileSize=formFile.getFileSize();System.out.println("文件名称:"+fileName);System.out.println("文件大小:"+fileSize);InputStream is=null;OutputStream os=null;try {//取出输入流is=formFile.getInputStream();//得到输出流--文件// 1 得到file文件夹上传到tomcat服务器后的绝对路径StringkeepFilePath=this.getServlet().getServletContext().getRealPat h("file");System.out.println(keepFilePath);//打印路径os=newFileOutputStream(keepFilePath+"\\"+fileName);//读取文件并写出到服务器fileint len=0;//缓存byte []bytes=new byte[1024];//循环处理while((len=is.read(bytes))>0){os.write(bytes,0,len);//读一点写一点}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {is.close();} catch (IOException e) {e.printStackTrace();}}return null;}4:在webroot下建立一个file文件夹完善struts文件上传(上面这种如果上传文件名相同的文件的话就会被覆盖首先了解uuid 的简单使用方法:String uuids=(java.util.UUID.randomUUID()).toString();面试题subString(int beginindex,int endindex);是如何截取的 : 获取字符串的一个子串,从beginindex包扩beginindex 取到endindex ,但是不包括endindex 如String subString="helloworld!";System.out.println(subString.substring(0,5));//打出hello beginindex是从0开始的优化后的代码为public class RegisterAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {UserForm userForm=(UserForm)form;String username=userForm.getUsername();//取出用户名字FormFile formFile=userForm.getMyphoto();// 通过FormFile 我们可以获取关于上次文件的各种信息String fileName=formFile.getFileName();String newFileName="";int beginIndex=stIndexOf(".");Stringuuid=(java.util.UUID.randomUUID()).toString();newFileName=uuid+fileName.substring(beginIndex, fileName.length());int fileSize=formFile.getFileSize();System.out.println("uuid:"+uuid);System.out.println("文件名称:"+fileName);System.out.println("新文件名称:"+newFileName);System.out.println("文件大小:"+fileSize);InputStream is=null;OutputStream os=null;try {//取出输入流is=formFile.getInputStream();//得到输出流--文件// 1 得到file文件夹上传到tomcat服务器后的绝对路径StringkeepFilePath=this.getServlet().getServletContext().getRealPat h("file");System.out.println(keepFilePath);//打印路径os=newFileOutputStream(keepFilePath+"\\"+newFileName);//读取文件并写出到服务器fileint len=0;//缓存byte []bytes=new byte[1024];//循环处理while((len=is.read(bytes))>0){os.write(bytes,0,len);//读一点写一点return mapping.findForward("loginok");}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {is.close();} catch (IOException e) {e.printStackTrace();}}return mapping.findForward("loginerr");}}注意事项:如果文件名是中文怎么办?做一个过滤器arg0.setCharacterEncoding("UTF-8");arg1.setCharacterEncoding("UTF-8");arg2.doFilter(arg0, arg1);案例: 保存到数据库中Create database userdb2;Use userdb2;Create table t_users(username varchar(30) unique not null,myphoto varchar(128) not null,##保存新的文件名myphoto2 varchar(128) not null ##保存旧的文件名);Q:1272307737文件下载如果下载的文件时中文名那么我们需要在action中对其进行处理StringfilterFilkename=.URLEncoder.encode(u.getMyphoto(),"GB 2312");思考: 如何控制文件的大小?如何控制文件上传类型?可以从D:\Program Files\Tomcat 6.0\conf目录下的 web.xml中可以查看文件的类型如何防止用户名重复?。

Structs学习笔记

Structs学习笔记

Structs学习笔记1. Struts是什么?答:1) Struts是一个开源框架,用于构建MVC架构Web应用程序;2) Struts是Jakarta项目的部分, 由Apache软件基金赞助;3) 通过使用Struts,你可在程序中清晰地分隔表现层和业务逻辑层;4) 通过提供广泛JSP标签库,Struts也提高了开发效率。

标签库解析和验证用户输入、错误处理以及国际化支持。

5) 我们将会向您展现如何使用Struts开发工具构建Struts的Web应用程序。

2. Struts资源答:为了学习更多Struts框架有关知识,请关注Struts官方网站以及用户向导:. /struts. /struts/userGuide/introduction.html3. MVC(model-view-controller)架构模式答:1) MVC架构模式在1980年由Smalltalk-80的图形用户界面库的开发者提出;2) 从此它在面向对象的用户界面和应用程序控制工具包中得到了广泛地应用,例如Struts,以及经过改良去满足特定平台需求,例如J2EE。

3) 根据MVC模式,一个软件组件(一个应用程序、一个模块等)应该将它商业逻辑和它的表现层分离;4. MVC的理由答:1) 对于相同的model你有超过一个view;2) 假如商业逻辑和它的表现层构建在一块,增加额外的view会导致相当大的中断以及增加组件的复杂性;3) 一个model有二个view的一个好的例子是一个银行应用程序,它可以通过互联网以及手机访问;4) 改变view的时候,你不希望每次改变model;5) view依赖于model,它显示给用户model的特定方面;6) 将view和model构建在一块,每次当你对view进行细小改动的时候,你不得不改动model;5. MVC模式答:这种分离可通过将组件分成以下层达到:. model层,实现商业逻辑;. view层,实现一个特定客户端类型的用户界面;. 有了这二层,我们可实现商业逻辑并且将它呈现给用户。

struts1学习

struts1学习

第五讲 Struts 学习一. Struts基本知识介绍Struts最早是作为Apache Jakarta项目的组成部分问世运做的。

项目的创立者希望通过对该项目的研究,改进和提高Java Server Pages (JSPs)、Servlet、标签库以及面向对象的技术水准。

它的目的是为了帮助你减少在运用MVC设计模型来开发Web应用的时间。

你仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。

如果想混合使用Servlets和JSP 的优点来建立可扩展的应用,Struts是一个不错的选择。

1. MVC框架介绍MVC即Model-View-Controller的缩写,是一种常用的设计模式。

MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。

Model(模型)模型包含应用程序的核心功能(应用对象)。

模型封装了应用程序的状态。

有时它包含的唯一功能就是状态。

它对视图或控制器一无所知。

View(视图)视图提供模型的表示(它在屏幕上的表示)。

它是应用程序的外观。

视图可以访问模型的读方法(get),但不能访问写方法(set)。

此外,它对控制器一无所知。

当更改模型时,视图应得到通知。

Controller(控制器)控制器对用户的输入作出反应(定义用户界面对用户输入的响应方式)。

它创建并设置模型。

通常MVC框架的结构如下图:MVC框架可是,Web 应用向软件开发人员提出了一些特有的挑战,最明显的就是客户机和服务器通过HTTP协议连接,而由于HTTP的无状态连接,使得控制器不能将应用程序的改变通知视窗。

为了发现对应用程序状态的修改,浏览器必须重新查询服务器。

所以,对于Web,需要修改标准的MVC 形式。

Struts 的体系结构实现了Model-View-Controller设计模式的概念,它将这些概念映射到web应用程序的组件和概念中。

形成了开发WEB应用的过程中最常用的框架:模型――视窗――控制器(MVC)框架。

学习struts总结

学习struts总结

Struts学习总结Write by扬帆起航2009年9月1.Action在什么时候初始化?发送请求时初始化,每个action只初始化一次所有的请求共享同一个实例,因此,必须在安全线程下进行编程。

存取资源的时候一定要注意同步。

线程是不安全的。

(要实现安全)为了实现安全编程应当这样:1.不要运用实例变量或者类变量共享数据,只是针对某个请求的数据。

2.注意资源操作的同步性。

1.关于action的访问的次数。

设计一个实例变量(count)统计次数,在调用的时候加上1.2.Actionforward 相当于导航器,用来配置对象,并且这些对象拥有独一的标示,从而允许他们按照name属性来进行检索actionforwad对象封装了向前进的url路径且被请求处理器用来识别目标视图,如jsp页面。

例如程序内跳转:<forward name=”loginSuccess”path=”/LoginSuccess.jsp”></forward>如果是程序外跳转:<forward name=”loginSuccess”path=””redirect=”true”></forward>Actionforward redirect=False,no --------------程序内转发相对当前运用True,yes --------------程序外转发必须写绝对路径3.ActionForm 工作原理以及有关注意的问题原理:先来请求通过*.Do查找,再通过配置文件找到Action 然后再看action是不是有name 属性,如果空的,就没有form。

再根据name属性和作用范围scope,就是调用scope.getAttribute(name),查找form bean的配置信息,检查form bean 的适用范围,确定在此范围下是不是有form bean,如果已经存在就直接调用,如果找到了(没有也会自动创建一个)就实例化一个(调用构造方法),并且通过scope.setAttribute(name,form)保存起来,供下一次请求时直接调用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts1 (1)Struts1和Servlet的关系 (1)创建第一个Struts1项目 (1)例子1: (3)总结重点:struts1的工作流程(基于MVC模式的) (7)一.普通的Servlet的工作流程 (7)二.Structs1的工作流程(和上面的对比记忆) (8)Struts标签 (9)Bean标签 (9)html标签 (10)logic标签(逻辑标记) (12)i18n(国际化) (13)Struts1Struts1和Servlet的关系Jsp+Servlet+JavabeanActionForm和VO的区别:一样的内容,不一样的作用ActionForm只接收前台表单传来的数据VO是conga后台提取的数据向前台传递创建第一个Struts1项目新建一个web项目,选择1.4即可右键----MyEclipse----Add Struts Capacity---------------Struts控制文件的路径TLD(标签)1)<html>2)<bean>:显示信息3)<login>:逻辑标签struts-config.xml<struts-config><data-sources/><!-- 连接数据库 --><form-beans><!--ActionForm的映射 --><form-bean name=""type=""></form-bean><!--name是ActionForm的名字,type是“包名.类名” --></form-beans><global-exceptions/><!--全局表达式 --><global-forwards><!--全局跳转,即可跳请求也可以跳页面 --><forward name=""path=""></forward><!--相当于public static final String success="" Action处理完毕后的转发对象--></global-forwards><action-mappings><!-- 必须有 --><action path=""forward="" ----局部的type=""></action><!-- 包名.类名 --></action-mappings><message-resources parameter=""/><!-- 资源文件 --></struts-config>担任Controller的是ActionServlet,所有的客户端请求都通过它来完成转发,必须在web.xml 中配置:注意:1)设定config参数的作用是设定struts-config.xml(包括了所有的Struts的相关请求转发及一些资源设定)的文档来源2)Servlet-mapping将所有以*.do结尾的请求将给ActionServlet来处理例子1:1)index.jsp<form action="user.do"method="post"><table><tr><td>用户名:</td><td><input type="text"name="username"></td></tr><tr><td>密码:</td><td><input type="password"name="pwd"></td></tr><tr><td colspan="2"><input type="submit"value="submit"><input type="reset"value="reset"></td></tr></table></form>2)struts-config.xml<struts-config><form-beans><form-bean name="userForm"type="erForm"></form-bean></form-beans><action-mappings><action path="/user"type="erAction" name="userForm"><forward name="success"path="/success.jsp"></forward><forward name="error"path="/error.jsp"></forward> </action></action-mappings></struts-config>3)UserFormpublic class UserForm extends ActionForm{private String username;private String pwd;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}4)UserActionpublic class UserAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {//1.得到表单中方的数据UserForm userform = (UserForm) form;String username = userform.getUsername();String pwd = userform.getPwd();//2.往后台传数据System.out.println(username+"======"+pwd);boolean flag = UserDao.getInstance().findByUser(username, pwd);if(flag){return mapping.findForward("success");}else{return mapping.findForward("error");}}}5)UserDao//单例模式public class UserDao {private static UserDao instance = new UserDao();private UserDao(){}public static UserDao getInstance(){return instance;}public boolean findByUser(String username,String pwd){return false;}}6)连接数据库(DBConnection 和UserDao)public boolean findByUser(String username,String pwd){boolean flag = false;DBConnection db = new DBConnection();String sql = "select username,password from users where username=? and password=?";try {Connection conn = db.connection();PreparedStatement pst = conn.prepareStatement(sql);pst.setString(1, username);pst.setString(2, pwd);ResultSet rs = pst.executeQuery();if(rs.next()){flag = true;}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return flag;}7)获取信息:在页面上可以使用EL表达式8)在UserForm中新加入两种方法://和表单中按钮的作用是一样的public void reset(ActionMapping mapping, HttpServletRequest request) {System.out.println("reset");}//验证框架public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {System.out.println("验证框架");return super.validate(mapping, request);}顺序:先清空,再放值,再验证9)动态获取表单的数据①struts-config.xml将原来的form-bean去掉<form-bean name="userForm"type="org.apache.struts.action.DynaActionForm"><form-property name="username"type="ng.String"></form-property><form-property name="pwd"type="ng.String"></form-property></form-bean>②将UserAction改为:public class UserAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {//1.得到表单中方的数据DynaActionForm userForm = (DynaActionForm) form;System.out.println(userForm.get("username")+"*******"+userForm.get("pwd"));String username = (String) userForm.get("username");String pwd = (String) userForm.get("pwd");//2.往后台传数据boolean flag = UserDao.getInstance().findByUser(username, pwd);if(flag){request.setAttribute("username", username);return mapping.findForward("success");}else{return mapping.findForward("error");}}}总结重点:struts1的工作流程(基于MVC模式的)一.普通的Servlet的工作流程1. web客户端发送一个request到tomcat2. tomcat接受请求,3. new HttpServletRequest对象4. new HttpServletResponse 对象5. 发送doGet/doPost到相应的servlet6. servlet截取到相应的URL7. 根据URL找到相应(文件/数据)8. 调用相应的业务逻辑—就是调用相应的Dao9. 对数据的操作—10. 返回给Dao一个结果11. 将Dao返回的结果返回到相应的servlet12. servlet会根据返回的结果找到跳转的页面13. 在tomcat会根据结果生成页面14. 将页面返回给web客户端二.Structs1的工作流程(和上面的对比记忆)1 web客户端发送一个request到tomcat2 tomcat接受请求3 new HttpServletRequest对象4 new HttpServletResponse对象5 发送doGet/doPodt方法到相应的ActionServlet6 ActionServlet会读取struts-config.xml文件7 截取url信息8 根据url的配置信息,取得数据(从struts中的Action标签的内容放到ActionMapping当中)9 New ActionForm对象(作用:会收集表单数据,进行存取)10 ActionServlet会取得表单数据11 New Action12 会执行Actiion中的execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)13 从ActionForm中取得数据14 调用相应的模型层15 返回数据搭配Action16 通过ActionForward返回到ActionServlet17 通过forward到视图层(jsp)生成jsp18 返回response到web客户端Struts标签Bean标签标签头在哪找到:struts包下的打开即写成<%@ taglib uri="/tags-bean" prefix="bean"%>1)BeanActionpublic class BeanAction extends Action{public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {request.setAttribute("hello", "测试一下");request.setAttribute("hello1", "<font color='red'>测试一下</font>");return mapping.findForward("show");}}2)struts-config.xml<action path="/bean"type="com.cstp.action.BeanAction"><forward name="show"path="/success.jsp"></forward> </action>3)success.jsp<bean:write name="hello"/><br><bean:write name="hello1"filter="true"/><br><bean:write name="hello1"filter="false"/><br>结果:其他标签:复制标记<bean:define>显示Bean属性<bean:write>标记<bean:message>标记注意:filter为true是不支持html代码html标签(只要是html就可以改成struts1的代码)和相同说明:生成的结果取决于Struts应用程序所位于的服务器的locale。

相关文档
最新文档