1.在web.xml文件中定义核心Filter来拦截用户请求(只有在web.xml文件中配置该框架的核心Servlet或Filter,在能让该框架介入到Web应用中)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>yq1818_struts2_day0919</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
2.定义处理用户请求的actio类
【1】、Action中怎么获取Servlet API有三种方式。
1) 解耦合:ActionContext
2) 耦合 :ServletActionContext
3) IOC :实现接口
ServletRequestAware:request
SessionAware:session
ServletResponseAware:response
-----------------------------------------------------------------------------
3.配置Action
<!-- struts.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<package name="d1" extends="struts-default">
<action name="user1" class="com.action.UserAction1" />
</package>
</struts>
这里使用的是第一种方式(解耦合),即ActionContext.getContext().getSession()
public class UserAction1 extends ActionSupport{
private Map<String,Object> request;
private Map<String,Object> session;
public Map<String, Object> getRequest() {
return (Map<String,Object>)ActionContext.getContext().get("request");
}
public Map<String, Object> getSession() {
return ActionContext.getContext().getSession();
}
//请求发送到servlet或filter被拦截(解析,封装参数等等)之后通过struts.xml来找对应的class,通过反射来创建对应的action实例
//定义处理用户请求的execute方法
@Override
public String execute() throws Exception{
this.getRequest().put("request1", "设置到作用域的值");
this.getSession().put("session1", "session值");
return super.execute();
}
----------------------------------------------------------------------------
启动Tomcat,在网址中访问对应的action即可看到如下内容:
http://localhost:8080/Day0920/user1.action
request:设置到作用域的值
session:session值
在MVC框架中控制器实际上由两个部分共同组成,即拦截所有用户请求,处理请求的通用代码都由核心控制器完成,而实际的业务控制(诸如调用Model,返回处理结果等)则由Action处理
上图里灰色区域包括的StrutsPrepareAndExecuteFilter和XxxAction共同构成了Struts2的控制器,
StrutsPrepareAndExecuteFilter被称为核心控制器。
XxxAction被称为业务控制器。
第二种方式:Action中以耦合(ServletActionContext)方式获取Servlet API
//耦合 :ServletActionContext
public class UserAction2 extends ActionSupport{
private HttpServletRequest request;
private HttpSession session;
public HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}
public HttpSession getSession() {
return ServletActionContext.getRequest().getSession();
}
@Override
public String execute() throws Exception {
this.getRequest().setAttribute("request1", "request21");
this.getSession().setAttribute("session1", "session21");
return super.execute();
}
}
对应struts.xml文件如下
<package name="d1" extends="struts-default">
<action name="user2" class="com.action.UserAction2" />
</package>
-------------------------------------------------------------
http://localhost:8080/Day0920/user2.action
request:request21
session:session21
第三种方式: IOC :实现接口
ServletRequestAware:request
SessionAware:session
ServletResponseAware:response
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction3 extends ActionSupport implements
ServletRequestAware,SessionAware,ServletResponseAware{
private HttpServletRequest request;
private HttpServletResponse response;
private Map<String,Object> session;
//可以在执行execute方法前,struts2通过底层拦截器调用set方法帮我们把request,response对象注入到属性里面去
@Override
public String execute() throws Exception {
this.request.setAttribute("request1", "request31");
this.session.put("session1", "session31");
return super.execute();
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response=response;
}
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
}
配置<action name="user3" class="com.action.UserAction3" />
访问http://localhost:8080/Day0920/user3.action
得到 request:request31
session:session31
4.配置处理结果和物理视图资源之间的关系,比如:
<package name="d1" extends="struts-default">
<action name="user4" class="com.action2.UserAction4">
<result>/ognl_demo.jsp</result>
</action>
</package>
ognl_demo.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
非值栈数据:
<br />
<s:set name="age" value="18" scope="request" />
<s:set name="userName" value="'aaa'" scope="session" />
<s:set name="test1" value="20" scope="session" />
<s:set name="test1" value="21" scope="request" />
age:
<s:property value="#request.age" />
-${age}
<br /> userName:
<s:property value="#session.userName" />
<br /> test1(session):
<s:property value="#session.test1" />
<br /> test1:
<s:property value="#attr.test1" />
<br /> 值栈:
<br /> loginName:
<s:property value="loginName" />
<br /> user.loginName:
<s:property value="user.loginName" />
集合遍历:
<br />
<s:if test="list!=null && list.size()>0">
<s:iterator value="list" var="u" status="s1">
<s:property value="#u.loginName" />-${u.loginName }-index:${s1.index },count:${s1.count}<br />
</s:iterator>
</s:if>
<s:else>没有找到数据</s:else>
</body>
</html>
public class User {
private String loginName;
private String password;
public User() {
}
public User(String loginName, String password) {
this.loginName = loginName;
this.password = password;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
}
public class UserAction4 extends ActionSupport{
private String loginName;
private User user;
private List<User>list;
@Override
public String execute() throws Exception {
loginName="testLogin";
user=new User("testLogin2","123");
list=new ArrayList<User>();
for(int i=0;i<10;i++){
list.add(new User("test"+i,"123"));
}
return super.execute();
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
}
访问http://localhost:8080/Day0920/user4.action得到如下信息
非值栈数据:
age: 18 -18
userName: aaa
test1(session): 20
test1: 21
值栈:
loginName: testLogin
user.loginName: testLogin2 集合遍历:
test0-test0-index:0,count:1
test1-test1-index:1,count:2
test2-test2-index:2,count:3
test3-test3-index:3,count:4
test4-test4-index:4,count:5
test5-test5-index:5,count:6
test6-test6-index:6,count:7
test7-test7-index:7,count:8
test8-test8-index:8,count:9
test9-test9-index:9,count:10
Struts1通常是execute方法,Struts2不配置的话默认是execute方法,配置了就是配置的方法