上篇内容的简单回顾
1、什么是Struts2?
Struts2是一个基于MVC设计模式的web层的框架。
2、常见的web层框架有哪些?
Struts2
Struts1
SpringMVC
Webwork
3、Web层框架
基于前端控制器模型。
4、Struts2的入门程序
下载Struts2的开发包
解压Struts2开发环境
创建web项目,引入jar包
即struts/apps/struts-blank.war/WEB-INF/lib/*.jar
编写JSP页面
编写Action类
配置Action类
配置核心过滤器
5、Struts2的执行流程
请求 --> 核心过滤器(StrutsPrepareAndExecuteFilter:预处理执行过滤器) --> 执行一组拦截器(完成部分的功能) --> Action --> Result。
6、Struts2的常见配置
(1)配置文件的加载顺序
后加载的配置文件中的常量值,会覆盖原先配置文件中常量的值。
(2)Action类的配置
package标签
- name :包名
- extends :继承,一般就为struts-default
- namespace :名称空间,与action中name共同决定访问路径
- abstract :是否让其他包继承
action标签
- name :与namespace共同决定访问路径
- class :Action类的全路径
- method :执行Action中的某个方法,默认值execute
(3)constant常量的配置(default.properties中定义了一大堆常量)
设置Struts2的常量,通常在struts.xml文件中配置。
(4)include配置
分模块开发的使用,在struts.xml中引入外部xml配置文件。
7、Struts2的Action的访问
(1)Action的编写
Action编写成POJO类
Action实现Action接口
Action继承ActionSupport类(常用)
(2)Action的访问
通过method属性配置
通过通配符的方式配置(常用)
动态方法访问的方式
Struts2的Servlet的API类的访问
有三种方式:
完全解耦合的方式。
Servlet原生的方式。
接口注入的方式。
1、完全解耦合的方式
JSP代码:
<h3>方式一:完全解耦合的方式</h3>
<form action="${ pageContext.request.contextPath }/requestDemo1.action" method="post">
账号:<input type="text" name="name" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="登录">
</form>
<hr />
Action类:
package com.pipi.struts2.demo1;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Arrays;
import java.util.Map;
// 访问Servlet的API,第一种方式:完全解耦合的方式
public class RequestDemo1 extends ActionSupport {
@Override
public String execute() throws Exception {
// 1、接收参数
// 获取ActionContext对象
ActionContext context = ActionContext.getContext();
// 调用getParameters()方法,获取参数集合
Map<String, Object> map = context.getParameters();
// 遍历Map集合,获取key,再得到其value,这里的value是String[]类型
for (String key : map.keySet()) {
String[] values = (String[]) map.get(key);
System.out.println(key + "---" + Arrays.toString(values));
}
// 2、往域对象中存入数据,其实是操作域对象的Map集合,并不是域对象本身
context.put("requestName", "requestValue"); // 存入request域对象的集合中
context.getSession().put("sessionName", "sessionValue"); // 存入session域对象的集合中
context.getApplication().put("applicationName", "applicationValue"); // 存入application域对象的集合中
return SUCCESS;
}
}
注意:
这种方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。
2、使用Servlet的API的原生方式(重点,常用的)
JSP代码:
<h3>方式二:使用Servlet原生的方式</h3>
<form action="${ pageContext.request.contextPath }/requestDemo2.action" method="post">
账号:<input type="text" name="name" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="登录">
</form>
<hr />
Action类:
package com.pipi.struts2.demo1;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Map;
// 访问Servlet的API,第二种方式:原生的方式
public class RequestDemo2 extends ActionSupport {
@Override
public String execute() throws Exception {
// 1、接收数据
// 直接获取request对象
HttpServletRequest request = ServletActionContext.getRequest();
// 调用request的获取参数的方法
Map<String, String[]> map = request.getParameterMap();
// 遍历map集合
for (String key : map.keySet()) {
String[] value = map.get(key);
System.out.println(key + "---" + Arrays.toString(value));
}
// 2、往域对象中存入数据
// 存入request域对象中
request.setAttribute("requestName", "requestValue");
// 获取session对象,再往其中存入数据
request.getSession().setAttribute("sessionName", "sessionValue");
// 获取application对象,再往其中存入数据
ServletActionContext.getServletContext().setAttribute("applicationName", "applicationValue");
return SUCCESS;
}
}
注意:
这种方式是常用的。
可以操作域对象的数据,同时也可以获得对象的方法。
3、接口注入的方式
JSP代码:
<h3>方式三:使用接口注入的方式</h3>
<form action="${ pageContext.request.contextPath }/requestDemo3.action" method="post">
账号:<input type="text" name="name" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="登录">
</form>
<hr />
Action类:
package com.pipi.struts2.demo1;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Map;
// 访问Servlet的API,第三种方式:接口注入的方式。实现ServletRequestAware, ServletContextAware接口
public class RequestDemo3 extends ActionSupport implements ServletRequestAware, ServletContextAware {
private HttpServletRequest request;
private ServletContext servletContext;
@Override
public String execute() throws Exception {
// 1、接收数据
// 使用接口注入的方式获得request对象
Map<String, String[]> map = request.getParameterMap();
// 遍历map集合
for (String key : map.keySet()) {
String[] value = map.get(key);
System.out.println(key + "---" + Arrays.toString(value));
}
// 2、往域对象中存数据
// 往request对象中存
request.setAttribute("requestName", "requestValue");
// 往session对象中存
request.getSession().setAttribute("sessionName", "sessionValue");
// 往application对象中存
servletContext.setAttribute("applicationName", "applicationValue");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
}
接口注入方式,比较繁琐,一般很少用到。
注意:
Servlet中的Servlet对象是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。
而Struts中的Action是多例的,一次请求,创建一个Action的实例。(不会出现线程安全的问题)