Struts2系列文章推荐: |
---|
👉 Struts2框架(一):入门xml配置及action编写 |
👉 Struts2框架(三):OGNL表达式与值栈 |
👉 Struts2框架(四):控制器&其他OGNL标签&拦截器 |
👉 待更新 |
文章目录
1、第一章内容回顾
Struts2的框架的概述
什么是Struts2
Struts2是一个基于MVC设计模式的web层的框架。
常见的web层框架
Struts2
Struts1
SpringMVC
Webwork
Web层框架
基于前端控制器模型
Struts2的入门程序
下载Struts2的开发包
解压Struts2开发环境
创建web项目,引入jar包
struts/apps/struts-blank.war/WEB-INF/lib/*.jar
编写JSP页面
编写Action类
配置Action类
配置核心过滤器
Struts2的执行流程
请求->核心过滤器(StrutsPrepareAndExecuteFilter)->执行一组拦截器(完成部分的功能)->Action->Result.
Struts2的常见配置
配置文件的加载顺序
后配置的配置文件中的常量的值会覆盖先配置的配置文件的常量的值。
Action的配置
package配置
name :包名
extends :继承
namespace :名称空间,与action中name共同决定访问路径
abstract :用于其他包的继承
action的配置
name :与namespace共同决定访问路径
class :Action类的全路径
method :执行Action中的某个方法,默认值execute。
constant配置(default.properties)
设置Struts2的常量
include配置
分模块开发的使用
Struts2的Action的访问
Action的编写
Action是POJO类
Action实现Action接口
Action继承ActionSupport类
Action的访问
通过method属性配置
通过通配符的方式配置
动态方法访问的方式
2、Struts2访问Servlet的API的方式
方式一:完成解耦合的方式
概述
在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的。在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到Session中,有的时候需要向页面输出一些内容,用到response对象。涉及到Servlet的API的访问。
编写JSP
<body>
<form action="${pageContext.request.contextPath}/user_login" method="post">
账号:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="确认">
</form>
</body>
编写Action
public class ActionDemo1 extends ActionSupport{
public String login(){
ActionContext context = ActionContext.getContext();
Map<String, Object> parameters = context.getParameters();
for (String key : parameters.keySet()) {
Object[] values = (Object[]) parameters.get(key);
System.out.println("key="+key+"==="+"values="+"==="+Arrays.toString(values));
context.put("commonInfo", Arrays.toString(values)+"by common");
context.getSession().put("sessionInfo", Arrays.toString(values)+"by session");
context.getApplication().put("applicationInfo", Arrays.toString(values)+"by application");
}
return "loginSuccess";
}
}
编写success页面
<body>
<h1>成功跳转!</h1>
<h3>${commonInfo }</h3>
<h3>${sessionInfo }</h3>
<h3>${applicationInfo }</h3>
</body>
注意:
1、这种方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。
2、注意filter的配置!!!
方式二:使用原生的方式(***)
编写JSP
编写Action
注意:
1、这种方式可以操作域对象的数据,同时也可以获得对象的方法。
2、这种方式不仅能使用的方法多,而且贴近之前编写的习惯
方式三:接口注入的方式
编写JSP
编写Action
注意:
1、Servlet是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。Action是多例的,一次请求,创建一个Action的实例(不会出现线程安全的问题)。
2、这种方式每次要使用一个对象都要重写一个方法,而且还要额外实现一个接口,比较麻烦
3、Struts2的结果页面的配置
结果页面的配置包括:全局结果页面、局部结果页面
全局结果页面
全局结果页面:全局结果页面指的是,在包中配置一次,其他的在这个包中的所有的action只要返回了这个值,都可以跳转到这个页面。
针对这个包下的所有的action的配置都有效。
局部结果页面
局部结果页面:局部结果页面指的是,只能在当前的action中的配置有效。
针对当前的action有效。
result标签的配置
result标签用于配置页面的跳转。在result标签上有两个属性:
name属性 :逻辑视图的名称。默认值:success
type属性 :页面跳转的类型。
dispatcher :默认值,请求转发。(Action转发JSP)
redirect :重定向。(Action重定向JSP)
chain :转发。(Action转发Action)
redirectAction :重定向。(Action重定向Action)
stream :Struts2中提供文件下载的功能。
4、Struts2的数据封装方式
方式一:属性驱动-提供set方法的方式(不常用)
Struts2框架是一个web层框架,web层框架(框架:软件的半成品,完成一部分功能)。Struts2提供了数据封装的功能。
编写页面
编写Action
方式二:属性驱动-页面提供表达式方式
编写JSP
编写Action
注意
1、页面提供表达式的方式来封装数据很简单,就是在页面的name多了个前缀 对象名.属性,使用的是OGNL表达式
2、Action类中一定要提供get和set方法,因为Struts底层就是有拦截器来实现数据封装,封装的前提是要获取到这个对象,如果不提供get方法,那么底层每次都要创建一个对象,并附上一个属性值,到最后就创建了n个对象,这样的话输出这个对象也只有一个属性值
方式三:模型驱动-采用模型驱动的方式
编写JSP
编写Action
注意
模型驱动方式最常用的方式:
缺点:只能同时向一个对象中封装数据。
使用第二种可以向多个对象中同时封装数据
属性驱动使用的拦截器是Params,模型驱动使用的是ModelDriven
5、Struts2的INPUT逻辑视图的配置
关于INPUT逻辑视图
Action接口中提供了五个逻辑视图的名称:
SUCCESS
ERROR
LOGIN
INPUT :input在某些拦截器中会使用。
NONE
INPUT的配置
在struts_demo.xml的package中:<result name="input">/regist.jsp</result>
在JSP中:添加标签库,<%@ taglib prefix="s" uri="/struts-tags"%>
。并在下方添加错误信息提示,<s:fielderror/>
6、Struts2的复杂类型的数据封装
封装到List集合中
编写JSP
编写Action
注意:
1、在进行数据封装的时候,底层使用的实例化对象没有用到重写构造方法,使用的是默认的
2、get、set方法,其后第一个字母必须大写,否则无法初始化
封装到Map集合中
编写JSP
编写Action
7、CRM综合练习:保存客户代码实现
保存操作流程
点击左侧的菜单页面页面:
跳转到添加页面(经过Action):
在添加页面中输入指定的信息,点击【保存】
将数据提交到ActionServiceDAO
最终回到列表页面
第一步:修改菜单页面上链接
<TR>
<TD class=menuSmall><A class=style2 href="${pageContext.request.contextPath}/customer_saveUI"
target=main>- 新增客户</A>
</TD>
</TR>
第二步:编写Action中的saveUI的方法
public String saveUI(){
return "saveUI";
}
第三步:配置页面跳转
第四步:修改添加页面
<FORM id=form1 name=form1
action="${pageContext.request.contextPath }/customer_save"
method=post>
第五步:完成保存操作
编写Action
编写Service
@Override
public void save(Customer customer) {
dao.save(customer);
}
编写Dao
@Override
public void save(Customer customer) {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
System.out.println(customer);
session.save(customer);
transaction.commit();
}
第六步:配置页面的跳转