使用Struts 2 开发程序的基本步骤:
加载Struts2 类库
配置web.xml文件
开发视图层页面
开发控制层Action
配置struts.xml文件
部署、运行项目
Struts2框架中所需的jar包 pox.xml:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.3</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.4.1</version> </dependency> <dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> <version>2.3.4.1</version> </dependency> </dependencies>
步骤1: 配置web.xml文件:
<web-app> <display-name>Archetype Created Web Application</display-name> <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:在src下创建名称为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> <!--该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。--> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> <!-- 配置文件中只要添加以下配置,那么以后修改配置文件不用重启tomcat --> <constant name="struts.devMode" value="true"/> <!--对默认主题风格修改 --> <constant name="struts.ui.theme" value="simple"/> <package name="default" namespace="/" extends="struts-default "> <action name="helloWorld" class="cn.happy.entity.HelloWorldAction"> <result name="success">success.jsp</result> <result name="errow">index.jsp</result> <result name="input">index.jsp</result> </action> </package> </struts>
namespace 和 action的name属性,决定 Action的访问路径 (以/开始 )
extends 继承哪个包,通常开发中继承 struts-default 包 (struts-default包在 struts-default.xml定义 )
继承struts-default包后,可以使用 包中定义拦截器和结果类型
action元素配置默认值
package 的namespace 默认值‘’‘’
action 的class 默认值 ActionSupport 类
result 的 name 默认值 success
步骤3:编写HelloWorldAction:
package cn.happy.entity; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import java.util.Map; /** * Created by CKW on 2017/2/28. */ public class HelloWorldAction extends ActionSupport implements Action{ private Users user; private String message; public void validate(){ if (this.user.getUname().length()==0){ addFieldError("uname","用户名不能为空"); } if (this.user.getUpassword().length()==0){ addFieldError("upwd","密码不能为空!"); } } public String execute() throws Exception { if ("111".equals(user.getUname())&&"111".equals(user.getUpassword())){ Map<String,Object> session=null; session= ActionContext.getContext().getSession(); session.put("aa",this.user.getUname()); //this.setMessage(this.user.getUname()); return "success"; }else{ addFieldError("cc","用户名或者密码不正确"); return "errow"; } } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
步骤4:创建index.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%--<%--%> <%--String path = request.getContextPath();--%> <%--String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";--%> <%--%>--%> <%@ page isELIgnored="false"%> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>登录</title> <div> <h2><s:property value="message"/> </h2> </div> </head> <body> <h1>登录</h1> <s:fielderror fieldName="cc"></s:fielderror> <s:debug></s:debug> <s:form action="helloWorld" method="POST"> <div> 姓名:<s:textfield name="user.uname"><s:fielderror fieldName="uname"></s:fielderror></s:textfield> </div> <br> <div> 密码:<s:textfield name="user.upassword"><s:fielderror fieldName="upwd"></s:fielderror></s:textfield> </div> <br> <s:submit value="提交"></s:submit> </s:form> <%--<form action="helloWorld" method="post">--%> <%--姓名:<input type="text" name="user.uname"/>--%> <%--密码:<input type="text" name="user.upassword"/>--%> <%--<input type="submit" value="提交"/>--%> <%--</form>--%> </body> </html>
为空判断:
错误判断:
登录正确页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%--<%--%> <%--String path = request.getContextPath();--%> <%--String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";--%> <%--%>--%> <%@ page isELIgnored="false"%> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>成功</title> </head> <body> <h1>登录成功!欢迎${sessionScope.aa} </h1> </body> </html>
步骤6.使用Servlet API去向Session中放入数据:
*解耦方案
ActionContext类 :
Map<> map= ActionContext.getContext().getSession();
map.put()
*耦合方案
HttpSession session=ServletActionContext.getRequest().getSession();
session.setAttribute();
=====常用常量:
<constant name="struts.i18n.encoding" value="UTF-8"/> ----- 相当于request.setCharacterEncoding("UTF-8"); 解决post请求乱码 <constant name="struts.action.extension" value="action"/> --- 访问struts2框架Action访问路径 扩展名 (要求) struts.action.extension=action, 默认以.action结尾扩展名 和 不写扩展名 都会分发给 Action <constant name="struts.serve.static.browserCache" value="false"/> false不缓存,true浏览器会缓存静态内容,产品环境设置true、开发环境设置false <constant name="struts.devMode" value="true" /> 提供详细报错页面,修改struts.xml后不需要重启服务器 <constant name="struts.ui.theme" value="simple"/>对默认主题风格修改
Action
Action书写的的三种格式
第一种
Action可以是 POJO ((PlainOldJavaObjects)简单的Java对象) —- 不需要继承任何父类,实现任何接口
* struts2框架 读取struts.xml 获得 完整Action类名
* obj = Class.forName(“完整类名”).newInstance();
* Method m = Class.forName(“完整类名”).getMethod(“execute”); m.invoke(obj); 通过反射 执行 execute方法
第二种
编写Action 实现Action接口
Action接口中,定义默认五种 逻辑视图名称
public static final String SUCCESS = “success”; // 数据处理成功 (成功页面)
public static final String NONE = “none”; // 页面不跳转 return null; 效果一样
public static final String ERROR = “error”; // 数据处理发送错误 (错误页面)
public static final String INPUT = “input”; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = “login”; // 主要权限认证 (登陆页面)
五种逻辑视图,解决Action处理数据后,跳转页面
第三种
编写Action 继承ActionSupport (推荐)
在Action中使用 表单校验、错误信息设置、读取国际化信息 三个功能
Action的配置method(通配符)
1) 在配置 元素时,没有指定method属性, 默认执行 Action类中 execute方法
2)使用通配符* ,简化struts.xml配置
<a href="${pageContext.request.contextPath }/user/customer_add.action">添加客户</a>
<a href="${pageContext.request.contextPath }/user/customer_del.action">删除客户</a>
struts.xml
<action name="customer_*" class="cn.itcast.struts2.demo4.CustomerAction" method="{1}"></action> --- {1}就是第一个* 匹配内容
动态方法调用
访问Action中指定方法,不进行配置
1) 在工程中使用 动态方法调用 ,必须保证 struts.enable.DynamicMethodInvocation = true 常量值 为true
2) 在action的访问路径 中 使用 “!方法名”
页面
<a href="${pageContext.request.contextPath }/user/product!add.action">添加商品</a>
配置
<action name="product" class="cn.itcast.struts2.demo4.ProductAction"></action>
执行 ProductAction 中的 add方法
Action访问Servlet API
1、 在Action 中解耦合方式 间接访问 Servlet API ——— 使用 ActionContext 对象
在struts2 中 Action API 已经与 Servlet API 解耦合 (没有依赖关系 )
* Servlet API 常见操作 : 表单提交请求参数获取,向request、session、application三个范围存取数据
actionContext = ActionContext.getContext();
1) actionContext.getParameters(); 获得所有请求参数Map集合
2) actionContext.put(“company”, “传智播客”); / actionContext.get(“company”) 对request范围存取数据
3) actionContext.getSession(); 获得session数据Map,对Session范围存取数据
4) actionContext.getApplication(); 获得ServletContext数据Map,对应用访问存取数据
2、 使用接口注入的方式,操作Servlet API (耦合)
1.要求action类必须实现提定接口。
ServletContextAware : 注入ServletContext对象
ServletRequestAware :注入 request对象
ServletResponseAware : 注入response对象
2.重定接口中的方法。
private HttpServletRequest request;
3.声明一个web对象,使用接口中的方法的参数对声明的web对象赋值.
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
3、 在Action中直接通过 ServletActionContext 获得Servlet API
ServletActionContext.getRequest() : 获得request对象 (session)
ServletActionContext.getResponse() : 获得response 对象
ServletActionContext.getServletContext() : 获得ServletContext对象
ServletActionContext.getPageContext().getSession(); //获取session等对象