Struts元素解析
-
package
- 作用:在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
- 属性:
- name:包的名称。注意:包的名称在配置文件中唯一
- extends:指定当前包的父包,一般情况下需要继承struts-default包,但不是必须的。 不过如果不继承的话,将无法使用struts2提供的核心功能。struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。
- abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有< action >元素的包,就可以声明为抽象包。
- namespace:名称空间。
- 当指定了名称空间之后,访问路径:名称空间 + 动作名称 = 访问路径
- 当不指定名称空间之后,该属性有默认值,默认值为"",注意不是"/"
- package的名称空间的查找顺序
-
action元素
- 作用:配置动作用的。
- 属性:
- name:动作名称
- class:动作类全名。默认的动作类是:com.opensymphony.xwork2.ActionSupport
- method:动作类中的方法名称。默认是public String execute(){}
- 要求:
- public的
- 返回值必须是String
- 没有参数
- 要求:
- 动作类:
- 创建方式一:就是原始的创建java类的方式
public class HelloAction {
/**
* 在动作类中的指定的动作方法
* 书写要求:
* 1. 都是public
* 2. 返回值都String
* 3. 没有参数
* @return
*/
public String sayhello(){
System.out.println("sayhello方法执行");
return "success";//与配置文件中的result的name值相对应
}
}
- 创建方式二:动作类实现Action接口(com.opensymphony.xwork2.Action)
/**
* 创建动作类的第二种方式:
* 创建一个普通的类,实现Action接口,实现接口中的方法
* @author 52261
*
*/
public class Action1 implements Action {
/**
* Action接口中的常量
* SUCCESS "success" 当执行成功时,前往指定位置
* NONE "none" 不返回任何结果视图
* ERROR "error" 当执行方法出现异常,前往指定的位置
* INPUT "input" 数据回显
* LOGIN "login" 一般用于登录页面
*/
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
- 创建方式三:动作类继承com.opensymphony.xwork2.ActionSupport(推荐使用)
/**
* 第三种方式:
* 创建一个类,继承ActionSupport
*
* 我们在开发中采取这种方式,来创建我们的动作类
* @author zhy
*
*/
public class Demo3Action extends ActionSupport{
//当我们在类中什么都不写,一个动作方法都不提供时,有一个默认的动作方法:execute()
}
Struts.xml
<!-- 第三种创建动作类方式的配置 -->
<action name="action3" class="com.itheima.web.action.Demo3Action">
<result name="success">/success.jsp</result>
</action>
<!-- 访问默认的动作类和动作方法的配置
默认的动作类是:ActionSupport的类。它是在struts-default.xml的配置文件中定义着。
-->
<action name="defaultAction">
<result name="success">/success.jsp</result>
</action>
- 动作的访问:
* 使用通配符
* 动态方法调用(注意:要将struts.enable.DynamicMethodInvocation配置上,配置为true)<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
* 代码演示:
/**
* 用户相关的动作类
* @author zhy
*
*/
public class UserAction extends ActionSupport {
public String addUser(){
System.out.println("添加用户");
return SUCCESS;
}
public String updateUser(){
System.out.println("更新用户");
return SUCCESS;
}
public String deleteUser(){
System.out.println("删除用户");
return SUCCESS;
}
public String findUser(){
System.out.println("查询用户");
return SUCCESS;
}
}
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>title</title>
</head>
<body>
<%-- 使用通配符,访问动作类和动作方法
<a href="${pageContext.request.contextPath}/add_User.action" >添加用户</a>
<a href="${pageContext.request.contextPath}/update_User.action" >更新用户</a>
<a href="${pageContext.request.contextPath}/delete_User.action" >删除用户</a>
<a href="${pageContext.request.contextPath}/find_User.action" >查询用户</a>
--%>
<%--动态方法调用
动作名称!动作方法名称.action
动作名称!动作方法名称
--%>
<a href="${pageContext.request.contextPath}/user!addUser.action" >添加用户</a>
<a href="${pageContext.request.contextPath}/user!updateUser.action" >更新用户</a>
<a href="${pageContext.request.contextPath}/user!deleteUser.action" >删除用户</a>
<a href="${pageContext.request.contextPath}/user!findUser.action" >查询用户</a>
</body>
</html>
Struts.xml
<!-- 动作方法调用的配置
<action name="addUser" class="com.lwb.web.action.Action3" method="addUser">
<result name="success">/addUser.jsp</result>
</action>
<action name="updateUser" class="com.lwb.web.action.Action3" method="updateUser">
<result name="success">/updateUser.jsp</result>
</action>
<action name="deleteUser" class="com.lwb.web.action.Action3" method="deleteUser">
<result name="success">/deleteUser.jsp</result>
</action>
<action name="findUser" class="com.lwb.web.action.Action3" method="findUser">
<result name="success">/findUser.jsp</result>
</action>-->
<!-- 使用通配符,配置动作方法
*表示的是动作的名称,当有和动作名称相匹配的时候可以用{出现的位置}来代替
<action name="*_*" class="com.lwb.web.action.Action3" method="{1}{2}">
<result name="success">/{1}{2}.jsp</result>
</action>
-->
<!-- 动态方法调用的配置 -->
<action name="user" class="com.lwb.web.action.Action3">
<result name="success">/success.jsp</result>
</action>
- result元素
- 作用:配置逻辑视图
- 属性:
- name:与动作方法的返回值对应,一致前往指定的jsp
- type:结果试图类型,就是用什么方式转到定义的页面。不写时,有默认值dispatcher。
- dispatcher:请求转发 默认值
- redirect:重定向
- chain:转发到另一个动作
- 转发到同一名称空间下的另一个动作
<result name="success" type="chain">action2</result>
- 转发到不同名称空间下的另一个动作 (代码跟重定向一样只不过type改成chain)
- 转发到同一名称空间下的另一个动作
- redirectAction:重定向到另一个动作
- 重定向到同一名称空间下的另一个动作
- 重定向到不同名称空间下的另一个动作
- 代码演示:
<package name="p1" extends="struts-default" namespace="/n1">
<!-- 重定向到同一包内的不同动作方法 -->
<action name="action1" class="com.lwb.web.action.Action3">
<result name="success">/success.jsp</result>
</action>
<action name="action2">
<result name="success" type="redirectAction">action1</result>
</action>
</package>
<package name="p2" extends="struts-default">
<!-- 重定向到不同包的不同动作方法 -->
<action name="action3">
<result name="success" type="redirectAction">
<!--使用的是注入的思想,在执行之重定向之前,会先获取这两个参数的值调用的就是setNamespace("/n2")和setActionName("action3")-->
<param name="namespace">/n1</param>
<param name="actionName">action1</param>
</result>
</action>
</package>
- 自定义结果类型:实现com.opensymphony.xwork2.Result接口或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport。
CAPTCHAResult.java
/**
* 自定义结果类型
* 第一步:
* 编写一个普通类,继承自StrutsResultSupport的类,并且重写doExcecute方法
* @author zhy
*
*/
public class CAPTCHAResult extends StrutsResultSupport {
//通过配置文件,调整生成图片的大小
private int width;
private int height;
//Servlet的中原来怎么写,现在还怎么写
protected void doExecute(String finalLocation, ActionInvocation invocation)
throws Exception {
/*
* 使用第三方生成验证码的jar包
* 1.拷贝ValidateCode.jar到工程lib目录
* 2.创建ValidateCode的对象
* 3.获取响应对象输出流
* 4.输出到浏览器
*/
//创建ValidateCode的对象
//参数详解:1:图像宽度 2.图像高度 3.数字的格式 4.干扰线条数
ValidateCode code = new ValidateCode(width,height,4,10);
//获取响应对象
HttpServletResponse response = ServletActionContext.getResponse();
System.out.println("图片送到");
//输出到浏览器
code.write(response.getOutputStream());
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
CaptchaAction .java
public class CaptchaAction extends ActionSupport{
}
struts.xml
<!-- 全局结果视图 -->
<package name="myDefault" extends="struts-default" abstract="true">
<!-- 自定义结果类型
在包中配置的结果视图,是只能当前包和其子包中使用
-->
<result-types>
<result-type name="captcha" class="com.lwb.web.result.CAPTCHAResult"></result-type>
</result-types>
<global-results>
<!-- 结果视图的查找顺序,先找当前动作类自己的,如果没有的,再去全局的结果视图中查找 -->
<result name="success" type="captcha">
<param name="width">240</param>
<param name="height">40</param>
</result>
</global-results>
</package>
<package name="p3" extends="myDefault">
<!-- 自定义结果类 -->
<action name="captchaAction" class="com.lwb.web.action.CaptchaAction" >
<!-- 写在action内部的结果视图,是只能当前动作类使用的
<result name="success" type="captcha">
配置图像的大小
<param name="width">240</param>
<param name="height">40</param>
</result>
-->
</action>
</package>
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<form action="" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
验证码:<input type="text" name="valicateCode"/>
<img src="${pageContext.request.contextPath}/captchaAction.action" />
<br/>
<input type="submit" value="登录" />
</form>
</body>
</html>
- 在动作类中访问Servlet的API
第一种方式:使用ServletActionContext的对象(推荐)
public class Action4 extends ActionSupport{
public String execute(){
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getServletContext();
HttpSession session = request.getSession();
System.out.println(request);
System.out.println(response);
System.out.println(application);
System.out.println(session);
return null;
}
}
只有request被Struts2给包装了,其他的都是由服务器包装的
第二种方式:使用的是依赖注入的方式,把我们想要的对象注入进去
public class Action4 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
private HttpServletRequest request;
private HttpServletResponse response;
private ServletContext application;
public String execute(){
// HttpServletRequest request = ServletActionContext.getRequest();
// HttpServletResponse response = ServletActionContext.getResponse();
// ServletContext application = ServletActionContext.getServletContext();
HttpSession session = request.getSession();
System.out.println(request);
System.out.println(response);
System.out.println(application);
System.out.println(session);
return null;
}
@Override
public void setServletContext(ServletContext application) {
this.application = application;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
总结
今天学习简单的Struts的应用,路径的一些问题还是有点绕,要好好总结一下