1.开发环境
在这里小编的开发环境是maven项目,jdk1.8,tomcoat8.0,嘻嘻这里可是非常重要的哦,使用的开发工具是eclipse,好了下面我们需要来放代码了,如果有不知道怎么创建maven项目的朋友可以看一下我上一篇的博客,里面写的很详细的。我们需要在pom.xml中放入这段代码
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.13</version>
</dependency>
2.Struts动态调用方法
1.配置文件
首先我们来看一下小编的项目的一个结构
这里的配置文件是小编事先就准备好了,为了跟好的区分开来所以写了三个,其实我们只需要写一个配置文件就可以了,下面我们就来讲一下sturts.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>
<!-- 配置jar里面原有的文件 -->
<include file="struts-default.xml"></include>
<!--作用于所有的模块文件 配置自己的基础文件 相当于一个通用的BsseDao文件 -->
<!--设置编码方式 -->
<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" />
</struts>
struts_sy_xml
<package name="base" extends="struts-default" abstract="true">
<global-allowed-methods>regex:.*</global-allowed-methods>
<!-- 引用包的概念 sy继承了base文件-->
</package>
struts_base.xml
<package name="sy" extends="base" namespace="/sy">
<!-- 配置跳转的路径名 -->
<action name="/demo_*" class="com.web.StrutsAction" method="{1}" >
<result name="rs">/rs.jsp</result>
</action>
</package>
2.调用方法
首先我们来看一下我们的jsp界面的一段代码
<h2>动态方法调用</h2>
<a href="${pageContext.request.contextPath }/sy/demo_add.action">新增</a>
<a href="${pageContext.request.contextPath }/sy/demo_del.action">删除</a>
下面就是我们的“中间商”,也就是我们的配置文件struts_base.xml
<package name="sy" extends="base" namespace="/sy">
<!-- 配置跳转的路径名 -->
<action name="/demo_*" class="com.web.StrutsAction" method="{1}" >
<result name="rs">/rs.jsp</result>
</action>
</package>
接下来就看一下我们被调用的后台方法吧!
public String add() {
System.out.println("调用add方法");
return "rs";
}
public String del() {
System.out.println("调用del方法");
return "rs";
}
这就是我们的动态调用方法,你可能没有看懂,不过没有关系,你仔细看看上面的配置文件,像以前你们写的时候是不是调用一个方法就要在配置文件中加一行代码,这个动态调用方法就方便了,以后就不用再一个一个的加代码了,哈哈哈,这样是不是很方便。好了看结果。出来了。。。。
3.Struts如何传值
1.jsp传到后台
- 参数赋值
1.1 Action中定义属性,并提供get/set方法
userName, getUserName/setUserName
1.2 ModelDriven
返回实体,不能为null,不需要提供get/set方法
1.3 ModelDriven返回实体和Action中属性重名,ModelDriven中优先级更高
注:ognl,ActionContext学完就知道了
从前太传值到后台的话有两种方式,一个是set/get方法,还有一个是ModelDriven
这里实体类就不展示了,实体类提供了set/get方法,和重写了tostring,下面直接展示小编的action吧!
package com.hu;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.entity.Cal;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class HelloAction implements ModelDriven<Cal>,ServletRequestAware {
private Cal cal1 = new Cal();
private Cal cal2;
private String sex;
public Cal getAl2() {
return cal2;
}
public void setAl2(Cal cal2) {
this.cal2 = cal2;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String accept1() {
req.setAttribute("cal1", cal1);
System.out.println("cal1:"+cal1);
return "rs";
}
public String accept2() {
System.out.println("cal2:"+cal2);
return "rs";
}
public String accept3() {
System.out.println(sex);
return "rs";
}
@Override
public Cal getModel() {
return cal1;
}
}
下面是展示界面的代码
<body>
结果页:
${sex }
<br>
${cal1 }
${cal2 }
</body>
这里直接展示效果吧!一号需要继承ServletRequestAware,然后req.setAttribute(“cal1”, cal1);存值
2.后台传到前台
后台传值到前台的话也有两种方式,一个是非注入,还有一个是注入
2 与J2EE容器交互
2.1 非注入
2.1.2 耦合
ServletActionContext
2.1.2 解耦(建立使用解耦模式)
ActionContext
2.2 注入
2.2.1 耦合
作业:找出struts2中其它的几个注入接口(XxxAware)
2.2.2 解耦
不管是注入还是非注入,我们所用的都是藕和方式,解藕一般很少使用,因为解耦里面所用到的参数“很长”,所以使用耦合的比较常见。
下面就来讲一下注入是什么? 注入其实就是继承ServletRequestAware 和 ServletResponseAware
展示关键代码,用来实现req和resp,怎么使用就不用解释了把!
private HttpServletRequest req;
private HttpServletresponse resp;
@Override
public void setServletRequest(HttpServletRequest req) {
this.req = req;
}
@Override
public void setServletRequest(HttpServletRequest req) {
this.req = req;
}
而非注入就是
public String accept1() {
System.out.println("cal1:"+cal1);
HttpServletRequest request = ServletActionContext.getRequest();//这里就是非注入
request.setAttribute("cal1", cal1);
return "rs";
}
小编刚刚出道,有什么写的不对的地方就指出来,大家一起进步。有喜欢的就点亮一下旁边的小红心吧,给小编的一个支持。。。