Struts2简介、初步使用
今日分享的是楼楼新学的一个框架,Struts2:
一:Struts2简介:
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互;Struts2是Struts的下一代产品,所以它是Struts1+WebWork合并的全新框架;Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计使得业务逻辑控制器能够与ServletAPI完全脱离开。
二:Struts2的使用:
2.1:Struts2的环境搭配
2.1.1:创建一个Maven项目,在pom.xml中配置Struts2框架依赖
<!-- 引用struts2框架核心依赖 -->
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.13</version> </dependency>
2.1.2:导入Struts2所需要的配置文件
Struts-base.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 设置编码集 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 开启动态方法调用 --> <constant name="struts.devMode" value="true" /> <!-- 不重启的情况下能修改代码理解生效 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 和上面一样 --> <constant name="struts.i18n.reload" value="true" /> <!-- 开启动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 实用动态方法调用必须配置的 --> <package name="base" extends="struts-default" abstract="true"> <!-- 在statu2.5版本之后,加了 regex:.* 默认将动态方法调用关闭,abstract 也要为true才能动态方法调用 这是处于系统安全考虑的。 --> <global-allowed-methods>regex:.*</global-allowed-methods> </package> </struts>
Struts-sy.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" 4 "http://struts.apache.org/dtds/struts-2.5.dtd"> 5 <struts> 6 <!-- 这是包的概念 能更细分action的分类--> 7 <package name="sy" extends="base" namespace="/sy"> 8 <!-- *代表你要调用的方法 --> 9 <action name="/dome_*" class="com.ht.web.HelloAction" method="{1}"> 10 <!-- 实用两个*,但是推荐使用 11 <result name="{2}">/{2}.jsp</result> 12 --> 13 <result name="rs">/rs.jsp</result> 14 </action> 15 </package> 16 </struts>
Struts.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" 4 "http://struts.apache.org/dtds/struts-2.5.dtd"> 5 <struts> 6 <include file="struts-default.xml"></include> 7 <include file="struts-base.xml"></include> 8 <include file="struts-sy.xml"></include> 9 </struts>
2.1.3:web.xml中配置核心拦截器
StrutsPrePareAndExectueFilter就是Struts2核心拦截器,当用户请求匹配的URL时,核心栏截器执行;
而我的配置中只要是.action结尾,就会自动执行核心拦截器。
web.xml配置
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Archetype Created Web Application</display-name> <filter> <filter-name>struts</filter-name> <!-- 相对于中央控制器,过滤请求 --> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> </web-app>
三:Struts2动态方法调用
3.1:新建一个HellowAction类来处理action代码
public class HelloAction /*extends ActionSupport*/ { /** * add方法 * @return */ public String add() { System.out.println("调用add方法。。。"); return "rs"; } /** * del方法 * @return */ public String del() { System.out.println("调用del方法。。。"); return "rs"; } }
3.2:新建一个demo.jsp,用jsp来调用测试action代码
<body> <h1>动态方法调用</h1> <a href="${pageContext.request.contextPath}/sy/dome_add.action">新增</a> <a href="${pageContext.request.contextPath}/sy/dome_del.action">删除</a> </body>
若是控制台输出了调用的方法就成功了
四:struts2前台传递数据到后台
有三种方式可以实现:
4.1 :实现 modelDrivern方法;
创建一个Cal实体类
package com.ht.entity; /** * Cal实体类 * @author Administrator */ public class Cal { private String num1; private String num2; public String getNum1() { return num1; } public void setNum1(String num1) { this.num1 = num1; } public String getNum2() { return num2; } public void setNum2(String num2) { this.num2 = num2; } @Override public String toString() { return "Cal [num1=" + num1 + ", num2=" + num2 + "]"; } }
在HellowAction中实现ModelDriven类
public class HelloAction implements ModelDriven<Cal>{ private Cal cal1 = new Cal(); @Override public Cal getModel() { return cal1; } /** *实现 modelDrivern 接收参数值 * @return */ public String accept1() { System.out.println("cal1:" + cal1); return "rs"; } }
在jsp中调用action中的方法
<h2>前台传数据给后台</h2> <a href="${pageContext.request.contextPath }/sy/demo_accept1.action?num1=20&&num2=5">accept1</a>
4.2:类实例.属性名
最好新建一个类写action代码:
public class ActionDome { private Cal cal2; public Cal getCal2() { return cal2; } public void setCal2(Cal cal2) { this.cal2 = cal2; } /** * 类实例.属性名 接收参数值 * @return */ public String accept2() { System.out.println("cal2:"+cal2); return "rs"; } }
jsp调用代码
<a href="${pageContext.request.contextPath }/sy/demo_accept2.action?cal2.num1=20&&cal2.num2=5">accept2</a>
4.3:通过set/get方法
在创建一个类来测试,action代码
public class ActionTest { private String sex; public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } /** * set/get 接收参数值 * @return */ public String accept3() { System.out.println(sex); return "rs"; } }
jsp调用代码
<a href="${pageContext.request.contextPath }/sy/demo_accept3.action?sex=nv">accept3</a>
四:数据交互(后台传数据至前台)
其实因为蛮简单的,就是实现ServletRequestAware接口和ServletResponseAware接口
4.1:注入(偶合),实现ServletRequestAware接口
public class HelloAction implements ModelDriven<Cal>,ServletRequestAware{ private Cal cal1 = new Cal(); private ServletRequestAware req; /** * 实现 modelDrivern 接收参数值 * @return */ public String accept1() { System.out.println("cal1:" + cal1); //注入耦合 req.setAttribute("cal1", cal1); return "rs"; } @Override public void setServletRequest(HttpServletRequest request) { // TODO Auto-generated method stub this.req=req; } }
4.2:非注入(偶合)
public String accept1() { System.out.println("cal1:"+cal1); //非注入耦合 HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("cal1", cal1); return "rs"; }
今日分享到此结束!谢谢观看!