开源框架之struts2笔记归纳

合集下载

struts2笔记

struts2笔记

第一讲: (4)Structs2的文件与myeclipse的Web工程的拷贝关系: (4)第二讲: (5)配置structs.xml文件: (5)调试工程: (6)如何在structs2启动开发模式: (7)第六讲: (7)如果解决更改了action名不能马上生效,需要重启服务器的问题: (7)如何解决查看jar包里的类,看到的是反编译后的内容而不是源码的问题: (8)如何配置jar包,以便可以查询javadoc: (9)如何解决没有提示的问题: (10)第九讲: (11)Structs2客户端请求访问的原理图: (11)Structs2好处: (11)第十讲: (11)Structs.xml中Namespace: (11)<package name=””>的作用: (12)<result name=”success”>: (12)<package>不写namespace: (12)复制粘贴工程时要注意的事项: (12)如何导入项目的流程: (13)如何重新配置JRE System Library(移除和载入): (14)第十一讲: (15)如何配置JSP文件里gb2312识别中文的问题: (15)Action有class属性;Action是个java类时的原理图: (15)第十二讲: (17)路径问题(JSP中如href=”的URL及action中namespace+name的那个方式): (17)JSP页面中获取structs2的标签<s:>: (18)第十三讲: (18)Action执行时并不一定要执行execute()方法,如何改变: (18)方法1(不推荐): (18)方法2(推荐使用): (18)第十四讲: (18)通配符配置(将配置量降到最低): (18)第十五讲: (19)用Action的属性接收参数(栈中会有,通过<s:property value=>取得): (19)第十六讲: (20)用DomainModel接收参数: (20)然而有时传递的参数和模型不匹配(如传递3个参数,模型只要2个)时: (21)举输入账户名、密码、确认密码这3个参数时,DomainModel只有2个参数,靠DTO传递的案例: (21)第十七讲: (22)用ModelDriven接收参数(MVC体现出V是JSP页面,M是那些model,C是action): (22)实现ModelDriven接收参数的原理图: (23)第十八讲: (23)Structs2参考文档位置: (23)Struct2解决中文问题(2.1.*和2.0的web.xml配置): (23)第十九讲: (24)简单数据验证的案例: (24)没有了request、response,怎么传递信息(addFieldError()): (24)怎么接收信息: (25)是否可以有传递多个addFieldError(可以): (26)第二十一讲: (27)Context是什么: (27)取得Map类型request,session,application,真实类型HttpServletRequest,HttpSession,ServletContext的引用;#request,session,application,attr;还有如何获取传递的参数(如form表单传递的): (27)第一种: (27)第二种(依赖注入;控制反转)(比较重要): (30)第三种: (31)第四种: (32)第二十三讲: (32)模块包含include: (32)默认action(DefaultAction): (32)第二十五讲: (33)Action总结: (33)第二十七讲: (33)Result的type类型: (33)Dispacher类型: (34)Redirect类型: (34)Chain类型(访问同一个包或别的包里的action): (34)redirectAction类型(跳转到另一个action): (35)第三十讲: (35)Global-Results(全局结果集;;当多个返回结果都是一个result时使用): (35)如何让别的package也用这个name=”user”的package的global-results: (36)第三十一讲: (36)Dynamic_result(动态结果集): (36)第三十二讲: (37)带参数的结果集(客户端需要跳转时传递:如何在不同值栈下,传递参数(type=redirect)): (37)值栈原理图: (37)传递失败的案例: (38)成功获取的案例: (39)第三十三讲: (39)Result总结: (39)第三十六讲: (40)什么是OGNL: (40)OGNL表达式访问值栈中普通属性、值栈中对象的普通属性: (40)第三十八讲: (42)OGNL表达式访问值栈中对象的普通属性(通过如.name访问): (42)第三十九讲: (43)OGNL表达式访问值栈中对象的普通方法: (43)OGNL表达式访问值栈中action的普通方法: (43)OGNL表达式访问静态方法、静态属性、Math类的静态方法: (43)OGNL表达式访问普通类的构造方法: (44)OGNL表达式访问集合: (44)第四十一讲: (46)OGNL表达式投影(过滤): (46)访问OGNL的stack从上往下,第0到位置到栈底的集合: (46)第四十四讲: (46)标签: (46)Property标签(如何只当普通字符串而不是OGNL表达式;如何给取不到的值设置默认值;设定HTML): (47)Set标签(设置值;设置范围;从request、ActionContext等取): (47)第四十六讲: (48)Bean标签,param(用于设置新的属性值): (48)第四十八讲: (48)Include标签(这个标签中value要当OGNL要%;%{}将文本属性解析为ognl): (48)$#%区别: (49)第五十讲: (49)If,elseif标签: (49)第五十一讲: (49)Iterator标签(遍历集合、遍历Map等): (49)Subset: (50)第五十二讲: (50)UL标签: (50)Theme主题: (50)设为simple(<s:fielderror/>会默认有<li>标签,使其带有。

Struts2学习笔记

Struts2学习笔记

Struts2项目的构建与配置1.配置struts.xml(1)配置struts.xml可以参考下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的struts.xml文件。

(2)主要的配置如下:<constant name="struts.devMode"value="true"/><package name="hello"namespace="/"extends="struts-default"><action name="hello"><result>/hello.jsp</result></action></package><constant name="struts.devMode"value="true"/> value="true"表示是开发模式,当修改了配置时服务器会自动加载修改后的配置,不需要中期服务器,方便开发。

(3)namespace="/"与浏览器的访问地址有关,namespace的默认值为空。

(4)<action name="hello"><result>/hello.jsp</result></action> action的name值与浏览器的访问地址有关,当地址是“http://…/hello”时,浏览器就会返回result中的hello.jsp 的页面。

2.配置web.xml(1)配置web.xml也可以参考下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的web.xml文件(2)主要配置如下:<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>3.配置Struts2的jar包(1)复制下载的struts-2.3.14.1-all.zip解压后的apps文件夹下的参考项目的WEB-INF\lib文件夹下的所有的jar包到我们自己项目的WEB-INF\lib文件夹下即可。

Struts2知识点整理

Struts2知识点整理


Struts2配置
struts.properties Struts2.x另一个核心配置文件,它所配置的有效属性有 struts.configuration
• 指定加载Struts2的配置文件的配置管理器,默认是: 指定web应用的默认Locale 指定web应用的默认编码集 指定strus2所需的国际化资源文件,多份时用","分隔。

验证程序配置
根元素<validators> 根元素下可以有任意多个filed和validator 每个filed可以使用多个验证程序 嵌入多个field-validator元素 field-validator元素 必须有一个type属性,指定一个验证程序 可以有一个short-circuit属性

通配符
例子1 <action name="UserAction_*" method="{1}">
• 例如:UserAction_add
例子2 <action name="*_*" class="{1}" method="{2}">
• <result>{1}_{2}_success.jsp</resutl>
• 字段级别
– fieldName=converterClass
xwork-conversion.properties
• 类级别
– 例如:app17.Color=ColorConverter

扩展StrutsTypeConverter类
绝大多数类都需要从String -->非String类型 ,以及从非String-->String

Struts2笔记

Struts2笔记

Struts2笔记Struts2的环境配制:首先在MyEclipse当中建立一个Web Project,下载一个struts2,有很多版本的,我现在用的是最新版本的struts-2.2.3,打开它的apps目录,里面有个struts2-blank.war(其实别的.war也可以),先用解压软件进行解压,然后打开解压的文件夹,WEB-INF/classes目录当中找到struts.xml,并把它复制到MyEclipse中新建的那个web project中的src目录下,将里面的内容清空,只留下<struts>标签和头部标签即可(也可将不要的内容注释,以作配制的参考),然后自行配制,在WEB-INF里找到web.xml文件,将里面的<filter>和<filter-mapping>标签及其内容拷贝进项目中的web.xml文件即可,再把\WEB-INF\lib当中的这些jar包commons-fileupload,commons-io,commons-lang,commons-logging,freemarker,javassist,ognl,struts2-core,xwork-core 拷到新建工程里面的\WEB-INF\lib当中去,上面提到的包不一定满足所有版本的需求,各个版本需要jar包都有些差别。

如果想看structs各个jar包里面的各个class的源文件,先在Referenced Libraries当中的一个jav 包上右击,点properties,然后选择Java Source Attachment,点External Folder选择它的源文件包,通常是在\struts\src\core\src\main\java目录下,这也就是location path的路径。

刚开始时,MyEclipse中的.xml跟java文件不同,定的时候比之java文件很不方便,感觉不能使用代码助手,是因为有东西没有配制,具体实现方法是windows->preference->然后XML Catalog(这里可以在框里输入catalog,可以迅速查到)->Add,location写的位置,Key Type 填URI,Key填struts.xml里面的那个Http地址,通常是:/dtds/struts-2.0.dtd这样的话,在编写.xml时就可以使用代码助手了。

struts2笔记

struts2笔记

Struts2笔记✧S truts.xml中的配置引用struts标签库<%@taglib prefix="s"uri="/struts-tags"%>Bean配置<bean class="" type="" name = "" scope="" static="" optional="">Type:bean的规范通常是某接口来体现;Scope: bean的作用域default、singleton、request、session、thread;Static:表明bean是否是静态注入,当指定了type属性时,该属性不应该指定为true Optional:指定bean是否是一个可选bean,可选属性。

常量配置<constant name="常量名" value="常量值">命名空间配置●当包制定了命名空间时action的路径为命名空间+action名称●如果在命名空间里找不到action系统会在默认的命名空间查找该action●配置跟命名空间namespace="/"包含配置<struts><include file="struts-shop.xml"></struts>Struts2会在struts.xml中配置多个struts配置文件拦截器配置●拦截器定义<intercepters><interceptor name="拦截器名" class="拦截器实现类"><interceptor-stack name="拦截栈名"><interceptor name="拦截器名" ><interceptor name="拦截器名" ></interceptor-stack></intercepters>●Action中使用拦截器<action name="" class=""><result name=""></result><interceptor name="拦截器名" ></action>Jsp页面中显示action属性(<s:property value="属性名称">)Action访问servletAPI●间接访问ActoinContext ac = ActionContext.getContext();●直接访问Action继承ServletActionContext可直接访问ServletAPI动态方法调用①<fomr action="action名称!方法名称.action" method="">②将指定方法名添加事件例:<input type="button" value="注册" onclick="regist()"/>③实现该方法function regist(){targetAction = document.form[0];targetAction .action = "action名称!方法名称.action";targetAction.submit();}④在action中实现该方法配置action中的method●使用通配符<action name="*_*" method ="{2}" class="{1}"><result name=""> /{2}.jsp</reuslt></action>●当请求中能匹配action的元素,则method=“第二个星号的内容”;class=“第一个星号的内容”结果页面为:第二个星号内容.jsp有完全符合URL请求的配置默认的Action(可显示连接视图)<defult-action-ref name="simpleViewResultAction"><action name="simpleViewResultAction" class=""><result name=""> </reuslt></action></defult-action-ref>Struts2支持多种处理结果类型(<result type="*"></result>)◆plintText类型处理结果(显示试图资源的源代码)<param name="location">/webcome.jsp</param><param name="charSet">/webcome.jsp</param> // 这只显示编码方式◆redirect类型处理结果(包括类型:redirectAction)请求参数、属性都会丢失◆动态结果使用通配符:*◆请求参数决定结果<result > ${参数名}.jsp</result>◆全局结果<global-result></global-result>所有的action都有效,现在本action搜索视图结果在搜全局结果。

struts2学习笔记2

struts2学习笔记2

11.Result配置详解说明:在前面的许多案例中我们所用到的Action基本都继承自ActionSupport这个类,而在这个类中我们定义了五个字段:SUCCESS,NONE,ERROR,INPUT,LOGING。

我们可以直接返回这些字段值,这些字段值实质是被定义成:String SUCCESS=”success”这样的形式,所以我们只要在Result元素中用它们的小写即可。

<result>标准完整形式如下:<result name="success" type="dispatcher"><param name="location">/default.jsp</param></result>如果我们都采用默认的形式,最终可以简写成:<result>/default.jsp</result>探讨type类型:以上对type 类型作简要的说明,下面来看实例:当一个Action 处理后要返回的Result 是另一个Action 时,作如何配置,关键就是配置type 类型。

步骤一:建立两个Action:TestAction 、Test2Action步骤二:web.xml 配置省略。

struts.xml 主要配置内容如下:<struts ><package name ="resultTest" extends ="struts-default"><action name ="test" class ="com.asm.TestAction"><result name ="success" type ="chain"> <param name ="actionName">test2</param ></result></action><action name="test2" class="com.asm.Test2Action"><result name="success">/test2Suc.jsp</result></action></package></struts>说明:在名为“test”的action中,我们配置result元素的type类型值为chain,意为将继续把Action传递到下一个名为test2的Action中去,在test2.action中会把页面转向到test2Suc.jsp中去。

struts2-课堂笔记案例

struts2-课堂笔记案例

目录第一章框架技术 (2)struts2框架 (2)struts2的基本流程: (2)struts2中产生作用域 (3)上课实例: (3)一、模拟向数据库添加对象 (3)二、模拟登陆效果 (4)三、struts2中产生作用域 (5)四、实现加减乘除效果 (5)五、从数据读出数据加载到表格,并实现增删改 (6)六,在案例五的基础上实现分页 (10)七、在struts2 中使用传统 servlet (11)第二章标签库 (12)list 用法 (12)上课实例: (13)一、基本标签使用 (13)二、上传文件 (14)三、下载文件 (15)四、s:iterator以及s:if用法 (16)第三章验证框架与拦截器 (17)验证框架 (17)使用验证框架的步骤 (18)规则: (18)正则表达式 (18)避免对ShwAction中的所有方法进行过滤 (19)上课实例: (19)一、对单一 add()方法进行过滤 (19)二、对某一类方法进行过滤 (20)拦截器 (21)上课实例: (22)一、通过扩展拦截器,实现权限控制 (22)配置拦截器 (24)第四章作用域 token 图表 (25)作用域 (25)在struts2里面怎么实现类之间的跳转 (25)Token 令牌 (26)上课案例: (26)struts----图表 (27)第五章 Stuts2中 dwr,JQuery用法 (29)一、DWR使用 (29)上课案例:DWR使用 (29)二、JQuery使用 (30)上课案例:一、利用JQuery 传值 (30)上课案例:二、利用JQuery 返回字符串、对象、集合(JSON用法1) (31)上课案例:三、利用JQuery 返回字符串、对象、集合(JSON用法2) (32)第一章框架技术framework----框架什么是框架?它有什么用?答:框架是一个应用程序半成品,在框架的基础上加自己的业务逻辑代码就可以形成最终的应用程序接下来要学习的有哪些框架?struts2 > hibernate > ibatis > spring使用框架的好处是,框架可以帮助完成一些辅助性的工作,让程序员专注于编写业务逻辑struts2框架它是一个作为"表示层"的框架,它的主要作用是与用户交互,它的作用与servlet相似struts2其实是集成两种框架技术的优点,形成的一种新的框架: struts1 + webworkstruts2 = struts1 + webwork---------------------------------------------------------------------以前编写web程序,主要使用servlet做为核心控制器采用struts2编写web程序,主要是使用 Filter(过滤器)+Interceptor(拦截器)作为控制器struts2的基本流程:1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面<jsp:forward page=”abcd!execute.action” />4、编写一个BaseAction类,用来封装属性,产生请求与响应5、编写ShwAction类中编写方法public String execute(){System.out.println("...............");return "yes";}6、编写show.jsp用于显示跳转以后的页面7、在struts.xml中编写代码,将jsp与类关联起来<struts><package name="struts2" extends="struts-default"><action name="abcd" class="org.java.web.ShwAction"><result name="yes">/show.jsp</result></action></package></struts>8、在web.xml中配置文件<dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping>----------<result name="success"> 不写默认为successstruts2框架所有的功能都是由一组过滤器与拦截器提供功能,这些过滤器与拦截器如果不加载,系统就没有任何功能系统所必须的一组过滤器与拦截器都封装一个名为 "struts-default"的包里面我们编写的package如果继承于struts-default这个包,在启动服务器的时候,这个包里面的过滤器以及拦截器才能加载到内存中,struts2才会有功能------------------------------------------------如果请求在进入action的时候,没有指定要进入哪一个方法,系统就会默认调用execute,如果方法不存在,就直接出错--------------------在提交表单的时候,表单中的数据,默认会自动存储到请求作用域中------------------------------------------request.setAttribute("uname",值);request.setAttribute("uage",值);将实体类作为属性来填充数据----------------------------------action类中的每一个方法,get与post都可以进入<result name=""> name属性默认值是: success---------------------------struts2的默认编码格式为 UTF-8,只要改为"gbk",就可以解决乱码文件struts2的所有默认的属性配置都在: default.properties文件中------------------------------------------------------------------要更改默认属性有两种方式:第一种方式: 在struts.xml文件编写如下代码:<constant name="struts.i18n.encoding"value="gbk"></constant>-----------------------------------------------------------------struts2中产生作用域的方式有四种:第一种: 让BaseAction实现 ServletRequestAwarepublicclass BaseAction implements ServletRequestAware{protected HttpServletRequest req;protected HttpSession ses;publicvoid setServletRequest(HttpServletRequest request) {this.req=request;this.ses=req.getSession();}--------------------------------------------------------------在struts2中,一个action类,默认可以包含多个方法,如果在进入action时,没有指定要访问哪一个方法,系统将默认调用 execute execute是默认访问的方法如果要访问类中的指定方法,格式如下:请求名称!方法名称.actionreg!test.actionreg!search.action--------------------------------------------------在struts2中,要使用jsp:forward必须在web.xml文件中,做如下配置<filter-mapping><filter-name>struts2</filter-name><url-pattent>*.action</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>上课实例:一、模拟向数据库添加对象1、创建web工程2、导入struts2的框架支持3、编写一个实体类Infpublic class Inf implements Serializable {private Integer id;private String name;private Integer age;4、编写jsp页面<form action="login.action">编号:<input type="text" name="f.id"/><Br/>姓名:<input type="text" name=""/><Br/>年龄:<input type="text" name="f.age"/><Br/><input type="submit" value="提交"/></form>5、编写一个Dao类,添加一个添加的方法public class Dao {public void add(Inf f){System.out.println("向数据库添加了一条数据:");System.out.println("编号:"+f.getId());System.out.println("姓名:"+f.getName());System.out.println("年龄:"+f.getAge());}}6、编写一个BaseAction类,封装Inf类,public class BaseAction {protected Inf f;public Inf getF() {return f;}public void setF(Inf f) {this.f = f;}}7、编写一个LoginAction,充当控制器(起到servlet的作用)public class LoginAction extends BaseAction{private Dao dao = new Dao();public String execute() {dao.add(f);return "ok";}}8、编写show.jsp用于显示跳转以后的页面<body>登录成功<hr/>编号: ${f.id}<Br/>姓名: ${}<Br/>年龄: ${f.age}<Br/></body>9、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="login" class="org.java.web.LoginAction"><result name="ok">/show.jsp</result></action></package>二、模拟登陆效果1、创建web工程2、导入struts2的框架支持;3、编写jsp页面<form action="login.action" method="post">用户名:<input type="text" name="uname"/>密码:<input type="text" name="upwd"/><input type="submit" value="登录"></form>4、编写一个BaseAction类public class BaseAction {protected String uname;protected String upwd;}5、编写一个LoginAction,充当控制器(起到servlet的作用)public String execute(){if(uname.equals("jack")&&upwd.equals("123")){return "success";}else{return "error";}}6、编写ok.jsp err.jsp用于显示跳转以后的页面7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="login" class="org.java.web.LoginAction"><result name="success">/ok.jsp</result><result name="error">/err.jsp</result></action></package>三、struts2中产生作用域1、创建web工程2、导入struts2的框架支持;3、编写jsp页面<form action="reg.action" method="post">姓名:<input type="text" name="uname"/><Br/>年龄:<input type="text" name="uage"><Br/><input type="submit" value="提交"></form>4、编写一个BaseAction类,产生请求作用域,publicclass BaseAction implements ServletRequestAware{ protected HttpServletRequest req;protected HttpSession ses;publicvoid setServletRequest(HttpServletRequest request) { this.req=request;this.ses=req.getSession();}5、编写一个ShwAction,充当控制器(起到servlet的作用)public String execute(){req.setAttribute("mess","这是请求中的消息....");ses.setAttribute("ses","这是session的消息");return "success";}6、编写show.jsp用于显示跳转以后的页面<body>姓名:${requestScope.uname}<Br/>年龄:${requestScope.uage}<hr/>请求:${requestScope.mess }<Br/>会话:${sessionScope.ses }</body>7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="reg" class="org.java.web.ShwAction"><result>/show.jsp</result></action></package>四、实现加减乘除效果1、创建web工程2、导入struts2的框架支持;3、编写jsp页面<form action="calculate!add.action" name="myfrm">第一个数:<input type="text" name="one"/><Br/>第二个数:<input type="text" name="two"/><Br/><input type="submit" value="加法" onclick="op('add')"/><input type="submit" value="减法" onclick="op('subtr')"/><input type="submit" value="乘法" onclick="op('chen')"/><input type="submit" value="除法" onclick="op('chu')"/></form>编写函数<script type="text/javascript">function op(methodName){var frm = document.forms.myfrm;frm.action="calculate!"+methodName+".action";frm.submit();//手动提交表单}</script>4、编写一个BaseAction类,封装Inf类,public class BaseAction implements ServletRequestAware{protected HttpServletRequest req;protected Integer one;protected Integer two;public void setServletRequest(HttpServletRequest request) {this.req=request;}5、编写一个LoginAction,充当控制器(起到servlet的作用)public class CalculateAction extends BaseAction {public String add(){Integer result = one+two;req.setAttribute("method","加法");req.setAttribute("result",result);return "success";}public String subtr(){Integer result = one-two;req.setAttribute("method","减法");req.setAttribute("result",result);return "success";}}6、编写show.jsp用于显示跳转以后的页面<hr/>第一个数: ${requestScope.one } <BR/>第二个数: ${requestScope.two } <br/>计算的方法:${requestScope.method }<Br/>计算的结果:${requestScope.result }<Br/><br/><A href="index.jsp">返回</A>7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts" extends="struts-default"><action name="calculate" class="org.java.web.CalculateAction"> <result>/show.jsp</result></action></package>五、从数据库读出数据加载到表格,并实现增删改1、创建web工程2、导入struts2的框架支持,导入Oracle驱动3、编写一个实体类Infpublic class Inf implements Serializable {private Integer id;private String name;private Integer age;4、编写jsp页面<jsp:forward page="abc!load.action" />5、编写一个Dao类public List<Inf>getList(){List<Inf> list = new ArrayList<Inf>();try {String sql = "select * from inf2";pst = getConn().prepareStatement(sql);rs = pst.executeQuery();while(rs.next()){Inf f = new Inf();f.setId(rs.getInt("id"));f.setName(rs.getString("name"));f.setAge(rs.getInt("age"));list.add(f);}} catch (Exception e) {e.printStackTrace();}finally{close();}return list;}public void add(Inf f){try {String sql = "insert into inf2 values(inf_seq.nextval,?,?)";pst = getConn().prepareStatement(sql);pst.setString(1,f.getName());pst.setInt(2, f.getAge());pst.execute();} catch (Exception e) {e.printStackTrace();}finally{close();}}public void del(Integer id){try {String sql = "delete from inf2 where id=?";pst = getConn().prepareStatement(sql);pst.setInt(1,id);pst.execute();} catch (Exception e) {e.printStackTrace();}finally{close();}}public Inf findById(Integer id){try {String sql = "select * from inf2 where id="+id;pst = getConn().prepareStatement(sql);rs = pst.executeQuery();if(rs.next()){Inf f = new Inf();f.setId(id);f.setName(rs.getString("name"));f.setAge(rs.getInt("age"));return f;}} catch (Exception e) {e.printStackTrace();}finally{close();}return null;}public void update(Inf f){try {String sql = "update inf2 set name=?,age=? where id=?";pst = getConn().prepareStatement(sql);pst.setString(1,f.getName());pst.setInt(2,f.getAge());pst.setInt(3,f.getId());pst.execute();} catch (Exception e) {e.printStackTrace();}finally{close();}}6、编写一个BaseAction类,封装Inf类,并产生请求作用域public class BaseAction implements ServletRequestAware{ protected Dao dao = new Dao();protected HttpServletRequest req;protected Inf f = new Inf();public Inf getF() {return f;}public void setF(Inf f) {this.f = f;}public void setServletRequest(HttpServletRequest request) { this.req = request;}}7、编写一个 MyAction,充当控制器(起到servlet的作用)public String load(){List<Inf> list = dao.getList();req.setAttribute("list",list);return "success";}public String add(){dao.add(f);load();return "success";}public String del(){Integer id = Integer.parseInt(req.getParameter("id"));dao.del(id);load();//重新加载return "success";}public String update(){Integer id = Integer.parseInt(req.getParameter("id"));Inf f = dao.findById(id);req.setAttribute("k",f);return "update";}public String modify(){dao.update(f);load();return "success";}8、编写show.jsp用于显示跳转以后的页面<body><table align="center" width="60%" border="1"><Tr id=”first”><th>编号</th><th>姓名</th><th>年龄</th><th>编辑</th></Tr><c:if test="${not empty requestScope.list}"><c:forEach items="${requestScope.list}" var="t"><tr align="center"><Td>${t.id }</Td><Td>${ }</Td><Td>${t.age }</Td><Td><a href="add.jsp">添加</a>&nbsp;&nbsp;<a href="abc!del.action?id=${t.id }"onclick="return confirm('你确定要删除该数据吗?')">删除</a>&nbsp;&nbsp;<a href="abc!update.action?id=${t.id}">修改</a></Td></tr></c:forEach></c:if></table></body>9、编写add.jsp用于添加数据到数据库<form action="abc!add.action">姓名:<input type="text" name=""><Br/>年龄:<input type="text" name="f.age"><Br/><input type="submit" value="添加"/><input type="button" value="返回" onclick="history.back()"/> </form>10、编写update.jsp用于修改数据<form action="abc!modify.action" method="post"><br><input type="hidden" name="f.id" value="${k.id}">姓名:<input type="text" name="" value="${}"/><Br/>年龄:<select name="f.age"><c:forEach begin="1" end="120" var="v" ><c:if test="${v==k.age}"><option value="${v }" selected="selected">${v}岁</option></c:if><c:if test="${v!=k.age}"><option value="${v }">${v}岁</option></c:if></c:forEach></select><Br/><input type="submit" value="修改"><input type="button" value="返回" onclick="history.go(-1)"> </form>11、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="abc" class="org.java.web.MyAction"><result name="success">/show.jsp</result><result name="update">/update.jsp</result></action></package>12、在struts2中,要使用jsp:forward必须在web.xml文件中,做如下配置<filter-mapping><filter-name>struts2</filter-name><url-pattent>*.action</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>13、建立 js 文件夹导入 jquery-1.5.2 ,编写my.js$(function(){$("tr:not(#first,#last)").mouseover(function(){$(this).css("background-color","lime");}).mouseout(function(){$(this).css("background-color","white");});$("tr:first").css("background-color","gray")});六,在案例五的基础上实现分页1、新建 Pagination类实现 Paginationpublic class Pagination implements Serializable {private Integer index = 1;// 当前页private Integer size = 3;// 每页三条private Integer maxCount;// 总数public Integer getMaxPage() {return maxCount % size == 0 ? maxCount / size : maxCount / size + 1;}}2、Dao 类中的查询所有数据的方法,以及得到总数的方法public List<Inf> findPage(Pagination p){List<Inf> list= new ArrayList<Inf>();try {//共总应该显示哪些rownumint total = p.getIndex()* p.getSize();//已经显示过的rownumint dona = (p.getIndex()-1)*p.getSize();String sql = "select * from (select rownum r,f.* from inf2 f whererownum<="+total+") t where t.r>"+ dona;pst = getConn().prepareStatement(sql);rs = pst.executeQuery();while(rs.next()){Inf f = new Inf();f.setId(rs.getInt("id"));f.setName(rs.getString("name"));f.setAge(rs.getInt("age"));list.add(f);}} catch (Exception e) {e.printStackTrace();}finally{close();}return list;}//查询数据表中的总记录数public Integer getMaxCount(){try {String sql = "select count(*) from inf2";pst = getConn().prepareStatement(sql);rs = pst.executeQuery();if(rs.next()){return rs.getInt(1);}} catch (Exception e) {e.printStackTrace();}finally{close();}return 0;}3、编写一个BaseAction类,产生会话作用域protected HttpSession ses;public void setServletRequest(HttpServletRequest request) {this.req = request;this.ses = request.getSession();}4、修改MyAction类中的load(),并添加分页显示的方法 change()public String load(){Pagination p = new Pagination();//分页对象//首先查询一共有几条数据,把信息保存到分页对象中Integer maxCount = dao.getMaxCount();//总记录数p.setMaxCount(maxCount);//把总数存到分页对象中List<Inf> list = dao.findPage(p);req.setAttribute("list",list);ses.setAttribute("p",p);//把分页信息存到session中return "success";}public String change(){Integer index= Integer.parseInt(req.getParameter("index"));//当前页Pagination p = (Pagination) ses.getAttribute("p");p.setIndex(index);//重设当前页List<Inf> list = dao.findPage(p);req.setAttribute("list",list);ses.setAttribute("p",p);//把分页信息存到session中return "success";}5、修改 show.jsp 在表格中添加一行显示分页信息<tr align="center" id="last"><Td colspan="4"><c:if test="${p.index==1}">首页&nbsp;&nbsp;上一页&nbsp;&nbsp;</c:if><c:if test="${p.index!=1}"><A href="abc!change.action?index=1">首页</A>&nbsp;&nbsp;<A href="abc!change.action?index=${p.index-1}">上一页</A>&nbsp;&nbsp;</c:if><c:if test="${p.index==p.maxPage}">下一页&nbsp;&nbsp;尾页&nbsp;&nbsp;&nbsp;&nbsp;</c:if><c:if test="${p.index!=p.maxPage}"><A href="abc!change.action?index=${p.index+1}">下一页</A>&nbsp;&nbsp;<A href="abc!change.action?index=${p.maxPage}">尾页</A>&nbsp;&nbsp;</c:if></Td></tr>七、在struts2 中使用传统 servlet1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面<form action="shw!add.action" method="post">用户:<input type="text" name="uname"/><Br/>年龄:<input type="text" name="uage"/><Br/><input type="submit" value="提交 "></form>4、编写BaseAction,产生请求与响应public class BaseAction implements ServletRequestAware, ServletResponseAware { protected HttpServletRequest request;protected HttpServletResponse response;public void setServletRequest(HttpServletRequest req) {this.request = req;}public void setServletResponse(HttpServletResponse res) {this.response = res;}}5、编写一个ShwAction类,继承BaseAction,充当控制器(起到servlet的作用)public void add() throws Exception{response.setContentType("text/html;charset=gbk");String name = request.getParameter("uname");Integer age = Integer.parseInt(request.getParameter("uage"));request.setAttribute("name",name);request.setAttribute("age",age);//request.getRequestDispatcher("/show.jsp").forward(request, response);response.sendRedirect("");}6、编写show.jsp用于显示跳转以后的页面<body>姓名:${ }<Br/>年龄:${requestScope.age }<BR/></body>7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="shw" class="org.java.web.ShwAction"/></package>第二章标签库要在页面中,使用struts2的标签库,首先需要导入标签指令<%@ taglib uri="/struts-tags" prefix="s"%>更改默认的编码格式:第一种方式: 在struts.xml文件配置如下代码:<constant name="struts.i18n.encoding" value="gbk">第二种方式: 在src目录下,创建一个属性文件: struts.properties,然后在文件中配置如下代码:struts.i18n.encoding=gbk如果这两种方式都配置,系统优先选择第二种方式list 用法第一种方式:<s:radio list="{'男','女'}" name="f.gender" value="'男'" label="性别"/> 这种方式表示: list中有两个选项,分别男和女,value用于设置默认值,它的默认值必须与其中的一个选项对应,真正被选中的值就是这两个选项中的一个第二种方式:<s:radio list="#{'male':'男','female':'女'}" name="f.gender" value="'male'" label="性别"/>list集合,在页面中绑定了一种键值对类型的数据,选中的是男或女,真正提交到后台的是male或female,······注意:前面应加上#号,另,设置默认值,只需要value与键相同即可第三种方式: 数据来自至于作用域 (map类型的集合)<s:radio list="%{#request.gender}"listKey="key"listValue="value"name="f.gender"value="'male'"label="性别"/>第四种方式: 数据来自至作用域 (List类型的集合,集合中放的是对象)<s:radio list="%{#request.list}"listKey="name"listValue="val"name="f.gender"value="'male'"label="性别"/>---注意:在struts2的标签中,传统的EL表达式都不允许使用要想在首页中使用 struts 标签必须在 web.xml 文件中配置如下<filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping>上课实例:一、基本标签使用1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面<%@ taglib uri="/struts-tags" prefix="s" %><body><jsp:forward page="shw!reg.action"/></body>4、编写一个Inf实体类public class Inf implements Serializable {private String name;//文本框private String pwd;//密码框private String gender;//单选按钮private Integer age;//下拉列表private String[] likes;//复选框private String remark;//文本域private Date regTime;//日历控件}5、编写一个BaseAction类,封装Inf类,以及产生请求作用域public class BaseAction implements ServletRequestAware{protected HttpServletRequest req;protected Inf f;}6、编写一个ShwAction类,充当控制器(起到servlet的作用)public String reg(){List<Gender> list = new ArrayList<Gender>();Gender g1 = new Gender();g1.setName("male");g1.setVal("男性");Gender g2 = new Gender();g2.setName("female");g2.setVal("女性");list.add(g1);list.add(g2);req.setAttribute("list",list);Map<Integer,String> ages = new TreeMap<Integer, String>();for(int i=1;i<121;i++){ages.put(i,i+"岁");}req.setAttribute("ages",ages);return "success";}public String register(){return "register";}7、编写reg.jsp用于提交用户信息<s:form action="shw!register.action"method="post"><s:textfield name=""label="用户名"/><s:password name="f.pwd"label="密码"size="21"maxLength="6"/><s:radio list="%{#request.list}"listKey="name"listValue="val"name="f.gender"value="'male'"label="性别"/><s:select list="%{#request.ages}"listKey="key"listValue="value"headerKey="-1"headerValue="请选择年龄"name="f.age"label="年龄"/><s:checkboxlist name="f.likes"list="{'足球','篮球','排球','台球'}"label="爱好"value="{'足球','台球'}"/><s:textarea name="f.remark"cols="20"rows="8"label="备注"/><s:submit value="注册"/></s:form>8、编写show.jsp用于显示跳转以后的页面<h1>注册信息如下</h1>姓名:${ }<Br/>密码:${f.pwd}<br/>性别:${f.gender }<Br/>年龄:${f.age }<Br/>爱好:<s:iterator value="%{#request.f.likes}"var="k">${k }&nbsp;</s:iterator><br/>备注:${f.remark }<Br/>注册时间:<s:date name="%{#request.f.regTime}"format="yyyy-MM-dd"/>9、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="shw" class="org.java.web.ShwAction"><result name="success">/reg.jsp</result><result name="register">/show.jsp</result></action></package>10、在src目录下,创建一个属性文件: struts.properties,然后在文件中配置如下代码:struts.i18n.encoding=gbk二、上传文件1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面导入标签 <%@ taglib uri="/struts-tags" prefix="s"%><s:form action="shw!register.action"method="post"enctype="multipart/form-data"><s:textfield name="uname"label="姓名"/><s:file name="myfile"label="文件1"/><s:file name="myfile"label="文件2"/><s:file name="myfile"label="文件3"/><s:file name="myfile"label="文件4"/><s:submit value="提交"/></s:form>4、编写一个BaseAction类,产生文件public class BaseAction {protected File[] myfile;protected String[] myfileFileName;protected String uname;}。

struts2学习笔记

struts2学习笔记
Байду номын сангаас
struts2 的处理流程: 核心控制器(StrutsPrepareAndExecuteFilter)--->Interceptor--->action---->业务逻辑层--->dao 层
一.struts2 核心文件 struts.xml 的配置
<package name="struts2" namespace="" extends="struts-default"> <action name="sum" class="com.alex.FirstAction"> <result name="positive">/positive.jsp</result> <result name="negative">/negative.jsp</result> </action> <constant name="struts.action.extension" value="jun,lu"/> <!--指定需要 Struts 2 处理的请求后缀,多个之间用逗号分开--> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <!--关闭动态方法调用。--> <constant name="struts.custom.i18n.resources" value="message"/> </package> 说明:space 声明命名空间。这里和表单提交的要保持一致。例如: namespace="/mystruts" 那么在表单提交的时候应该<s:form action="mystruts/sum.action" > namespace="" 那么在表单提交的时候应该<s:form action="sum.action" > 2.<action name="sum" class="com.alex.FirstAction"> class 便是对应的 Action 类 name 对应 action 的唯一标识。和表单提交时保持一致。例如: name="yj" 那么在表单提交的时候应该<s:form action="yj" > 3.<result name="positive">/positive.jsp</result> 判断跳到哪一个页面,其中 name 是唯一标识。和"com.alex.FirstAction"的返回值进 行对比。相同就跳到相应的页面 4. <constant name="struts.custom.i18n.resources" value="message"/> 配置常量 资源文件--> 1.Action 范围:类名.properties (在国际化的时候,那么就应该是:类名_zh_CN.properties ) //配置一些类型转换错误信息和其他的信息 2.包范围:package.properties 需要放在包下面,只能被该包和子包访问 (在国际化的时候,那么就应该是:package_zh_CN.properties ) 3.全局范围:通过 struts.custom.i18n.resources 来定义全局资源文件,比如在 struts.xml 中配置: <constant name="struts.custom.i18n.resources" value="message"/> 那么全局资源文件就是 message.properties
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts部分: (1)1)为什么要学习Struts框架 (2)2)为什么使用MVC? (2)3)MVC在JavaWeb中的实现 (2)*4) Struts2的主要工作流程 (2)3.Struts2框架的历史 (4)*4.Struts2框架基本使用 (4)1.Struts2使用基本规则 (5)Struts2标签+OGNL表达式 (6)2)OGNL工作原理 (6)4.OGNL在Struts2中的应用 (8)1)xwork对ognl进行扩展和改造 (8)*2)ValueStack对象(参考valuestack.jpg) (9)*3)在JSP中访问ValueStack数据方法 (9)a.使用Struts标签+OGNL表达式 (9)b.使用EL表达式 (9)1.Struts2框架Action组件的核心应用 (10)1)Action组件基本原理 (10)*3)Action属性注入 (11)*4)如何利用一个Action处理多个请求 (11)1.前期课程回顾 (11)1.Result组件原理 (12)1)Result组件的作用 (12)2)Result组件实现规则 (12)*2.常用的几种Result组件 (13)2)Action响应 (13)1.Struts2标签 (14)1)通用标签 (14)2)表单标签 (15)2.拦截器组件 (15)*2)掌握自定义拦截器的使用 (16)Struts部分:======================Day01=========================1)为什么要学习Struts框架Struts框架是MVC设计模式的实现,基于Struts开发可以简化开发难度,提高开发效率。

2)为什么使用MVC?MVC是一个非常优秀的设计思想,基于该思想架构程序,可以提高程序的结构灵活性,便于日后维护、扩展和升级。

3)MVC在JavaWeb中的实现Servlet,JSP,Filter,JDBCa.原ShoppingCart程序就是一个MVC结构实现View实现部分:采用JSP组件实现Model实现部分:采用DAO、Entity等组件实现Controller实现部分:采用ActionServlet组件实现b.ShoppingCart程序虽然基于MVC,但结构还有一些问题:当请求数量比较多时,需要在Servlet中编写大量的if...else分支语句,而且Servlet代码量非常多。

改造方案:为Servlet提供一个XML配置文件,用于定义请求和Action组件的对应关系。

然后将if...else分支中的代码提取到对应的Action组件中。

*4) Struts2的主要工作流程a.首先客户端浏览器发送一个请求,请求到达控制器。

b.控制器根据xml配置信息调用相应的Action组件(XML配置了请求和Action对应关系)c.执行Action组件业务处理,该组件可以调用DAO,Cart,Entity等组件。

d.控制器调用JSP视图组件生成一个响应界面给浏览器5)Struts的内部原理:编程原理:用户发送http请求---》Web服务器(tomcat)--》加载web.xml(web部署描述文件)文件-执行struts核心控制器(StrutsPrepareAndExecuteFilter或者filterDispatcher)-->加载struts.xml文件,通过请求action名字找到匹配的action-->在action中调用(execute)(业务层|数据层)-->执行result=“"-->通过result 找到struts.xml与result名字匹配结果--》转发到页面返回给调用者程序调用:struts内部原理图:(1)用户发送http请求--》启动web服务器---》加载web.xml(web部署描述文件)配置文件---》执行web.xml中相应过滤器ActionContextCleanUp:清除页面中的属性other filter(SiteMesh:装饰过滤器)SiteMesh作用:页面布局、装饰FilterDispatcher:struts2核心控制器注意:(a)使用SiteMesh(装饰过滤器),struts2容器不在管理页面中属性,需要调用ActionContextCleanUp完成销毁(b)过滤器执行是有顺序ActionContextCleanUp-->SiteMesh-->FilterDispatcher(2)中央控制器FilterDistpacher询问ActionMapper是否需要请求action(3)如果需要请求action,FilterDispatcher就会调用它的代理(ActionProxy)加载配置文件(4)ActionProxy会调用Configuration Manager读取strus.xml配置文件注意:只加载一次(5)根据请求名字,ActionProxy(action代理)调用所有拦截器(Inertceptor),ActionProxy(action代理)创建Action Invocation,去执行所对应action类,根据Action类中名字找到匹配result页面(jsp、freeMarker、Velocity)等技术,在此执行拦截器注意:struts2拦截器和servlet过滤器功能相同,并比filter强大拦截器执行顺序:先进后出(6)相应给用户(HttpServletResponse)3.Struts2框架的历史Struts2框架和Struts1没有必然联系,它是将原来的WebWork框架核心部分Xwork提取,进行封装后发布为Struts2。

*4.Struts2框架基本使用*1)Struts2使用步骤*a.下载发布包,将核心包导入web工程struts2-core-2.1.8.jar:Struts2核心包xwork-core-2.1.6.jar :Xwork核心包ognl-2.7.3.jar :OGNL技术工具包,与EL相似,但比EL强大。

freemarker-2.3.15.jar:界面模板技术,与JSP相似。

commons-fileupload-1.2.1.jar :文件上传包。

*b.配置Struts2控制器,在src下添加struts.xml、Struts2控制器采用的是StrutsPrepareAndExecuteFilter组件实现。

在web.xml文件中配置该Filter组件。

c.根据请求编写Action,DAO,Entity等组件*2)HelloWord示例welcome.action-->struts2控制器-->WelcomeAction-->welcome.jsp----------------------Struts2详细工作流程---------------------------a.浏览器发出welcome.action请求b.请求到达Struts的Filter控制器(由于web.xml配置)c.Struts控制器判断请求类型,如果是/welcome.action或/welcome格式请求,将调用struts.xml配置,寻找对应的Action组件d.调用Action组件的execute方法处理请求,最后返回一个String视图标识e.Struts控制器根据视图标识寻找相应的JSP(struts.xml中result配置)f.调用JSP视图生成响应界面给浏览器显示。

======================Day02========================= 1.Struts2使用基本规则1)web.xml配置涉及了Struts2的Filter控制器配置a.<filter-class>指定正确包名.类名b.<url-pattern>指定/*,控制器可以识别Action组件请求2)Action编写规则a.执行方法的定义public String XXX(){} 默认方法名是executeb.属性变量的定义public class User{private String username;//成员变量是username//属性是userpublic void setUser(String user){ername = user;}public String getUser(){return username;}}注意:如果action需要接收请求数据或向JSP传递数据,需要与属性名保持一致。

3)struts.xml中的Action配置1)元素嵌套顺序<struts>--><package>--><action>--><result>2)<package>元素的extends属性必须继承自struts-default3)<action>元素name请求名不要加.action,class指定的Action类要正确。

4)<result>元素的name属性与Action方法返回值保持一致。

2.实现一个列表显示功能/list.action-->ProjectListAction-->projectlist.jsp1)开发步骤a.引入struts2和数据库的驱动包b.添加struts.xml配置文件,web.xml添加了Struts控制器配置c.添加DBUtil工具类d.添加Entity类e.添加DAO编写方法f.添加Actiong.添加Action配置(struts.xml)h.添加JSP,显示列表引入jstl标签库的jar包。

在JSP页面添加标签库引入指令使用<c:forEach>标签limit begin,sizebegin = (page-1)*sizepage begin1 02 33 6n (n-1)*3===========================Struts2标签+OGNL表达式3. OGNL表达式1)什么是OGNLOGNL技术可以独立使用,封装在ognl.jar开发包中。

Object Graphics Navigation Language 对象图导航语言。

主要作用是对一些复杂对象的属性和方法进行访问。

EL表达式主要功能:用于访pageContext,request,session,application范围内存储的数据。

OGNL不仅可以访问数据,还具有访问方法,对集合进行操作等功能。

2)OGNL工作原理OGNL工具由三部分构成,分别是a. OGNL引擎:负责解释执行OGNL表达式,按表达式区root或map区域寻找数据。

相关文档
最新文档