收藏 分享(赏)

struts学习笔记2011.doc

上传人:HR专家 文档编号:11423520 上传时间:2020-04-19 格式:DOC 页数:33 大小:1.61MB
下载 相关 举报
struts学习笔记2011.doc_第1页
第1页 / 共33页
struts学习笔记2011.doc_第2页
第2页 / 共33页
struts学习笔记2011.doc_第3页
第3页 / 共33页
struts学习笔记2011.doc_第4页
第4页 / 共33页
struts学习笔记2011.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、l 建立一个Struts2 工程 1在MyEclipse中新建web工程 2在struts-2.2.1.1-allstruts-2.2.1.1解压struts2-blank.war( 最基础的示例程序 ) 3进入struts-2.2.1.1appsstruts2-blankWEB-INFclasses下把struts.xml拷到web工程的src下面,因为工程编译完它默认就把src下的文件放到class文件下面。、 4.拷类库,在这个项目的lib文件下面拷把jar放入lib后看不见jar文件,是因为MyEclipse默认视图是package Explorer,如果要看硬盘上对应的视图,应该打开

2、windows-Show View-other-navigatior4.配置web.xml,参考struts自带的web.xml,把filter的配置拷过来 struts2 org.apache.struts2.dispatcher.ng.filterNg:next generation下一代的filter,用的是2.1的;跟2.0有区别,2.0用的filter用的是:org.apache.struts2.dispatcher.FilterDispatcher.StrutsPrepareAndExecuteFilter通过这个名字可以看出跟2.0的区别,这里调用了两个filter,一个是pre

3、pare一个是execute filter. struts2 /*l 第一个示例程序Hello StrutsStruts常量的配置,struts.devMode开发模式,开发模式改为true之后,修改配置文件可以马上生效,不用重启服务器。 /hello.jsp http:/localhost:8080/strust2_0100_Introduction/这里的“/”对应namespace的“/”,因为action 的name属性为hello,所以敲 http:/localhost:8080/strust2_0100_Introduction/hello 或者http:/localhost:80

4、80/strust2_0100_Introduction/hello.action默认的aciton是可以省略的跳转到hello.jsp,第一个示例程序成功!l Struts2读源码配置文件中的 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter一看就应该知道它是对应一个类,在jar文件中找到对应的源码编译完的class文件,查看源码: jar文件点右键-properties-Java Source AttachmentExternal Folder (外部文件)struts-2.2.1.1-all/str

5、uts-2.2.1.1/src/core/src/main/java 点击class文件可以查看源码了,假如想看它的doc文档,同样的方法jar文件点右键-properties-Javadoc Location-导入doc就可以在源码中右键或者F1观察对应的文档了。l 敲尖括号不提示的问题Struts.xml文件头定义了配置:windows-preferences-catalog-。xmlxml CatalogAddAdd入本地定义当前xml的dtd文件:找到struts2-core-2.2.1.1.jar解压开找到struts-2.1.7.dtd这就是我们写xml要参考的那个文件完成,验证代

6、码提示成功!l Struts2的运行机制当你在客户端敲http:/localhost:8080/strust2_0100_Introduction/hello首先找到:strust2_0100_Introduction这个web application,找到后去执行这个web application下的web.xmlTomcat接收到请求之后,会发现这个web.xml下面,配了一个filter,而这个filter过滤所有的url地址,所以当我们在地址栏敲http:/localhost:8080/strust2_0100_Introduction/hello后,会被StrutsPrepareAn

7、dExecuteFilter接收到 struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*StrutsPrepareAndExecuteFilter接收到后url情求后,它首先看namespaceStruts.xml /hello.jsp 查到“/”后面的hello,它就会去package下面查是否有name属性叫“hello”的action,有的话,找里面对应的result是谁-hello.jspStruts的好处就是:我可以把“请求”和“视图展现”分开,而不是写死。分开

8、的好处就是:如果要换成其他视图,配一下就好了,所以更加灵活。Struts核心的本质就是解决了:把你的请求和最后的结果分开。Important!面试!l Struts的namespace示例工程Struts2_0200_NamespaceStruts.xml /Namespace.jsp /Namespace.jsp 所以namespace为空意味着:只要找到一个index.action,没有找到精确的对应的namespace,全部都交给namespace为空的这个package去处理,所以这个package囊括了其他所有package处理不了的action。l Struts自定义具体视图的返回

9、示例工程Struts2_0300_Actionl 修改jsp模板字符编码:windows-preferences- JSP 修改编码为UTF-8即可IndexAction1.javapublic class IndexAction1 public String execute() return success;IndexAction2.javapublic class IndexAction2 implements Action public String execute() return success;真正企业开发只用这第三种!另外两种忘记!IndexAction3.javapublic

10、class IndexAction3 extends ActionSupport public String execute() return success; /ActionIntroduction.jsp 具体视图的返回可以由用户自己定义的Action来决定具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容具体Action的实现可以是一个普通的java类,里面有public String execute方法即可或者实现Action接口不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法如果不配置class属性,默认执行xwork框架的A

11、ctionSupport这个action,这个action就有execute这个方法,return success。l Struts路径问题示例工程:Struts2_0400_Pathstruts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。虽然可以用redirect方式解决,但redirect方式并非必要。 解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径) 或者使用myeclipse经常用的,指定basePath先点击链接http:/localhost:8080/Struts

12、2_0400_Path/path/path.action 跳转到path.jsp 页面在path.jsp页面上有链接index.jsp虽然在webRoot上面index.jsp和path.jsp同级,但是点击index.jsp却跳到http:/localhost:8080/Struts2_0400_Path/path/index.jsp如果改成index.jsp跳到http:/localhost:8080/index.jsp 因为JSP中“/”代表整个站点的根路径而不是应用的根路径。解决方案是:永远使用绝对路径。 base Base标签的意思是当前所有url链接前面都会自动加上base标签配置

13、的href路径href= /request.getContextPath()会拿到webapplication的名称:Struts2_0400_Pathrequest.getScheme()拿到“http”字符串request.getServerName()拿到“localhost”request.getServerPort()拿到“8080” l 动态方法调用Action执行的时候并不一定要执行execute方法可以在配置文件中配置Action的时候用method=来指定执行哪个方法也可以在url地址中动态指定(动态方法调用DMI)(推荐)a href=/user/userAdd添加用户a

14、href=/user/user!add重点只用这一种,叫做动态方法调用DMI.添加用户前者会产生太多的action,所以不推荐使用 /user_add_success.jsp /user_add_success.jsp l Action接收参数的方式Action有三种接收参数的方式1. 属性接收参数2. 用DomainModel(实体模型)接收参数3. 用ModelDriven接收参数( 不常用 )l 用Action的属性接收参数Struts2_0700_ActionAttrParamInputIndex.jspbase href=/ 使用action属性接收参数添加用户 链接的意思是:执行u

15、ser下面的user.action下面的add方法怎么接受参数的呢?第一种方式.在自己的action下面定义两个属性,写好get,set方法,当new 完action的时候,会自动把这两个属性从参数里面拿过来,帮你设置好。参数跟我们的成员变量一一对应,这时候它就会自动把我们的参数传递到我们成员变量里。这时候当我们调用add()方法时,它直接可以用了。UserAction.javapublic class UserAction extends ActionSupport private String name;private int age;public String add() System.

16、out.println(name= + name);System.out.println(age= + age);return SUCCESS;public String getName() return name;public void setName(String name) this.name = name;public int getAge() return age;public void setAge(int age) this.age = age;Struts.xml /user_add_success.jsp l 使用Domain Model (实体模型) 接收参数Struts2

17、_0800_DomainModelParamInput 使用Domain Model接收参数添加用户public class UserAction extends ActionSupport private User user;/private UserDTO userDTO;public String add() System.out.println(name= + user.getName();System.out.println(age= + user.getAge();return SUCCESS;public User getUser() return user;public voi

18、d setUser(User user) this.user = user;public class User private String name;private int age;public String getName() return name;public void setName(String name) this.name = name;public int getAge() return age;public void setAge(int age) this.age = age;一般来说,我们输入参数不一定刚好跟我们的域模型一致,比如说:用户有name跟password两个

19、属性,但是你输入进来的应该还有个密码确认passwordconfiguration这时候我们要么使用属性接收,要么用DTO,或者VO l Struts2_2.1.6版本的中文问题根据Struts文档的规定:只要在Struts.xml中配置这段话就可以解决中文乱码问题 但是2.1.6版本中这是一个Bug,没法解决中文乱码问题解决办法是:一:升级到2.1.7之后的版本;二是:使用spring的filter,在web.xml中配置过滤三:在web.xml中配置2.0版本的filter struts2 !-org.apache.struts2.dispatcher.ng.filter.StrutsPr

20、epareAndExecuteFilter-org.apache.struts2.dispatcher.FilterDispatcher2.0版本的filterStruts2文档的位置:struts-2.1.8.1-allstruts-2.1.8.1docsdocs 要知道Strust.xml中有哪些常量可以配置,可以进文档里面查看例子:struts.i18n.encoding=UTF-8 /表示默认字符集是UTF-8struts.action.extension=action, /后缀名可以是“action”,或者是“”空也行。l Struts模块包含Struts.xml中:配相当于把文件l

21、ogin.xm内容l复制过来l Struts简单数据验证示例程序:Struts2_1100_SimpleDataValiationUserAction.javapublic class UserAction extends ActionSupport private String name;public String add() if(name = null | !name.equals(admin) this.addFieldError(name, name is error);this.addFieldError(name, name is too long);可以对同一个名字加多个错误。

22、return ERROR;如果校验出错,return ERROR,跳到user_add_error.jsp return SUCCESS;public String getName() return name;public void setName(String name) this.name = name;Struts.xml /user_add_success.jsp /user_add_error.jsp 登陆不成功的时候,该怎么样向前台传递信息呢? 这时候其实是个麻烦事,因为我们的userAction实际上是没有跟我们的Request, response属性绑在一起的;userActi

23、on访问不到我们的Request, response,ServletContext,这些都没有,在Struts2里面是采用另外一种机制。This.addFieldError(“name”,”name is error”);添加对于属性校验的错误信息的,错误信息的名字一般也是我们的属性名字叫做name,那么这个属性出错,后面是这个错误的具体信息:name is error!user_add_error.jspUser Add Error!这里调用addFieldError()之后在前面如何把它拿出来?在这里我们用到struts2的标签调用标签库的时候,必须这么写:%taglib uri=”/st

24、ruts-tags” Uri实际是在jar包里,META-INF下面的struts-tags.tld文件里面的struts-tags这部分内容prefix=”s”%Struts的标签定义是位于 如果我们去看源码的话会看到它把我们的错误信息封装成:name is error!指定成CSS修饰,这样就给我们带来不便,这是Struts2设计不太好的地方。所以Struts2展现的标签在企业开发中应用得不多,因为它都是强制要求你必须按照它的命名规则来去定义它的各种各样的展现。那我们应该怎么样把我们的字符串拿出来?引出下一个标签,这个标签以后会很常用:当你写了这个标签之后在页面就会默认显示这个标签 Deb

25、ug点开Debugl Struts ValueStack(值栈) DebugValue Stack Value Stack,中文翻译过来叫做”值栈”,首先它是一个栈,栈就是一个容器,栈有个特点就是”后进先出”,”值栈”就是我有一个栈,里面放的是一系列的值。ContentsObjectProperty NameProperty Valuecom.bjsxt.struts2.user.action.UserActiontextsnullactionErrorserrorsname=name is error, name is too long因为定义了两个,所以这里name有两个值这里去的时候er

26、rors.name0=name is errorerrors.name1=name is too longfieldErrorsname=name is error, name is too longerrorMessagesnamealocalezh_CNactionMessagescom.opensymphony.xwork2.DefaultTextProvidertextsnull首先:Struts2会把Action里面的属性挨着排给你放进Value Stack 来专门有这个标签很常用s:property取到errors实际上是一个map:name=name is error, name

27、 is too long那么我想取到map里面某一个key的内容:name is error, name is too long而这时候实际上value是一个数组,所以我要想去数组的第一项这就是OGNL了name is errorl Struts2_访问Web元素后台的Action跟我们前台的页面来通讯的时候,由于它拿不到request,session,servletContext比如当我们有人登陆了,我们要在session中设一个值,表示它登陆了,但是如果你Action访问不到session,你如何把相关的数据设到session里面,response不用访问它,因为我们的结果是通过result返回的。取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:前三者:依赖于容器前三者:IOC (只用这种)后三者:依赖于容器后三者:IOC用户名:密码:Strust.xml /user_login_success.jsp 第一种方式:(忘记)取值的方法:可以在构造方法LoginAction1里面取值,也可以在execute方法取值。就是说:下面三行“取值”代码可以写

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报