02.Struts2-01框架
1、创建Action类:
处理请求的类,当Struts捕获到请求的时候会交给该类中的某个指定方法去处理
1、创建普通Java类
2、配置该Java类,作为Struts2中的一个Action
Struts2的核心配置文件
<struts>:配置文件的根节点,有且只有一个,所有的配置项必须全部写在根节点中
<package>:包,Struts2的基础配置之一,一般用于存放一组或者一个(Action:一个Java类,用于处理一个请求)
name:该报的唯一标识,在struts程序中的
extends:该包集成了哪个包的配置
<action>:行为标签
name:该action的唯一标识,对应处理的请求的url
2、Action类
1、必须要有一个无参数的构造方法
2、可以提供SET方法接收表单提交的参数,set方法要对应表单元素的name属性进行生成
3、同一个Action中可以有多个请求处理方法
4、Struts2的Action是线程安全的,不用去考虑并发问题
如何访问ServletAPI
HttpServlerRequest -> request
HttpSession -> session
ServletContext -> application
*HttpParameters
解耦:
一般不会直接访问这个对象
HttpServlerRequest -> request ->requestAttributeMap
HttpSession -> session ->sessiionAttributeMap
ServletContext -> application ->applicationAttributeMap
直接访问对象存值的方案
XXX.setAttribute(key,value);
通过作用于对应的Map存值的方案
XXXMap.put(key,value);
ActionContext ac = ActionContext.getContext();
获取AttributeMap的第一种方案
注意:这些只能进行存值取值操作,不能替代对象本身
Map<String,Object> sessionAttributeMap = ac.getSession();
sessionAttributeMap.put(“key”, value);
Map<String,Object> applicationAttributeMap = ac.getApplication();
applicationAttributeMap.put("key", value);
Map<String,Object> requestAttributeMap = (Map<String,Object>)ac.get("request");
requestAttributeMap.put("key", value);
//获取AttributeMap的第二种方案
//实现接口
ApplicationAware
SessionAware
RequestAware
//重写
setApplication
setSession
setRequest
@Override
public void setXXX(Map<String, Object> XXX) {
this.XXXAttributeMap = XXX;
}
//该方法中的参数,就是我们需要的对应的Map
耦合:
耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
案例:
导入相应的包
jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
在页面的URL
/url:绝对路径 ->协议名称(http)+主机名(127.0.0.1)+端口号(8080)+URL
url:相对路径 ->协议名称(http)+主机名(127.0.0.1)+端口号(8080)+项目名 (struts2Test03)+当前的URL+URL
所有路径都是绝对路径
-->
<form action="user/userWelcome">
Username:<input type="text" name="username"><br>
Psername:<input type="text" name="password"><br>
age:<input type="text" name="age"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>欢迎下次光临!</h1>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="user/tm1" method="post">
<input type="text" name="testValue"><input type="submit" value="提交啊">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${sessionScope.msg }|${requestScope.msg1 }|${applicationScope.msg2 }
</body>
</html>
web.xml(filter配置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>struts2Test03</display-name>
<filter>
<filter-name>dispatcherFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>dispatcherFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
struts.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>
<!--
namespace:给该包名添加一个映射
默认值为:/
-->
<package name="java53" extends="struts-default" namespace="/user">
<action name="tm2" class="com.zb.action.TestAction" method="testMethod01">
<result>
/page04.jsp
</result>
</action>
<action name="tm1" class="com.zb.action.DepartAction" method="testMethod01">
<result>
/page04.jsp
</result>
</action>
<action name="userWelcome" class="com.zb.action.UserAction" method="testMethod01">
<!--
type
适用于到页面
dispatcher:默认值,转发
redirect:重定向(到Action也可以用该属性)
适用于到Action
chain:转发到Action
redirectAction:重定向到Action
-->
<result name="toPage02" type="chain">
stuWelcome
<!--
访问非本命名空间的Action
<param name="namespace">/user</param>
<param name="actionName">stuWelcome</param>
-->
</result>
<result>
/page02.jsp
</result>
</action>
<action name="stuWelcome" class="com.zb.action.StuAction" method="testMethod02">
</action>
</package>
</struts>
Action包(.java)
package com.zb.action;
public class StuAction {
public String testMethod02() {
System.out.println("我是STU ACTION中的内容");
return "toPage02";
}
}
package com.zb.action;
//*Struts的Action类是线程安全的,不用担心并发问题
public class UserAction {
//封装属性
private String password;
private Integer age;
//必须有一个无参的构造方法(一般是由系统提供了,只有当我们自己在Action类中手动声明了带参数的构造方法之后才需要注意)
public String testMethod01() {
return "success";
}
/*
* 可以通过SET方法接收参数
* set方法接受参数的时候,跟方法参数名无关
* 跟Set方法名有关
* SET方法会比Action的目标方法优先执行
* */
public void setUsername(String abc) {
System.out.println(abc);
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(Integer age) {
this.age = age;
}
}
package com.zb.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
public class DepartAction implements ApplicationAware,SessionAware,RequestAware {
private String testValue;
Map<String,Object> sessionAttributeMap;
Map<String,Object> applicationAttributeMap;
Map<String,Object> requestAttributeMap;
public String testMethod01() {
System.out.println("被访问了!");
//获得Struts的ActionContext容器
ActionContext ac = ActionContext.getContext();
//request.setAttribute("msg","我已经成功接收到你输入的测试值了");
/*
Map<String,Object> sessionAttributeMap = ac.getSession();
sessionAttributeMap.put("msg", "我已经成功接收到你输入的测试值了");
Map<String,Object> applicationAttributeMap = ac.getApplication();
applicationAttributeMap.put("msg2", "我是在Action中通过ApplicationAttributeMap存入的内容");
Map<String,Object> requestAttributeMap = (Map<String,Object>)ac.get("request");
requestAttributeMap.put("msg1", "我是REQUESTMap中存的值,我的获取方式特殊一点");
*/
sessionAttributeMap.put("msg", "我已经成功接收到你输入的测试值了2");
applicationAttributeMap.put("msg2", "我是在Action中通过ApplicationAttributeMap存入的内容2");
requestAttributeMap.put("msg1", "我是REQUESTMap中存的值,我的获取方式特殊一点1");
System.out.println(testValue);
return "success";
}
public void setTestValue(String testValue) {
this.testValue = testValue;
}
@Override
public void setApplication(Map<String, Object> application) {
this.applicationAttributeMap = application;
}
@Override
public void setSession(Map<String, Object> session) {
this.sessionAttributeMap = session;
}
@Override
public void setRequest(Map<String, Object> request) {
this.requestAttributeMap = request;
}
}
package com.zb.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
public class TestAction{
public String testMethod01() {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
System.out.println(request);
System.out.println(session);
System.out.println(application);
request.setAttribute("msg1", "啊哈哈");
session.setAttribute("msg", "起飞");
application.setAttribute("msg2", "恰饭");
return "success";
}
}
3、练习
练习
使用Struts2框架完成如下功能
1、完成登录后的用户状态记录,用于验证用户是否登录,以及是否有权限进入登录注册以外的其他页面
2、完成对用户信息表的查询功能,并回传数据到页面
3、完成用户修改密码功能
4、在页面接受用户提交的爱好信息(复选框,后台使用数组接收),并在后台迭代显示
*完成今天练习的基础上,补全昨天练习中直要求捕获请求的Action目标方法
预习
如何在Struts2中如何设置请求后缀
Struts2中如何进行动态方法调用
了解Struts2中的值栈
sion.setAttribute(“msg”, “起飞”);
application.setAttribute(“msg2”, “恰饭”);
return "success";
}
}
## 3、练习
>练习
> 使用Struts2框架完成如下功能
> 1、完成登录后的用户状态记录,用于验证用户是否登录,以及是否有权限进入登录注册以外的其他页面
> 2、完成对用户信息表的查询功能,并回传数据到页面
> 3、完成用户修改密码功能
> 4、在页面接受用户提交的爱好信息(复选框,后台使用数组接收),并在后台迭代显示
> *完成今天练习的基础上,补全昨天练习中直要求捕获请求的Action目标方法
>预习
> 如何在Struts2中如何设置请求后缀
> Struts2中如何进行动态方法调用
> 了解Struts2中的值栈
> Struts2的标签库中标签的使用