12、Struts2高级技术

本文介绍Struts2框架的应用实践,包括配置web.xml、创建Action类处理请求、使用OGNL表达式操作属性及方法,同时演示了如何通过自定义拦截器记录Action执行时间,并展示了用户注册的具体实现。

对应第15章

操作普通属性和方法的例子
例:

配置web.xml
写类 public class Student{}  (P351)

//  创建Action类 OGNLAction.java
package com.lyq.action;
import java.util.Map;
import com.lyq.bean.Student;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class OGNLAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    // 普通属性name
    private String name;
    // 学生对象
    private Student student ;
    // Map类型的request
    Map<String, Object> request;
    // 构造方法
    @SuppressWarnings("unchecked")
    public OGNLAction(){
        // 实例化学生对象
        student = new Student();
        // 对学号赋值
        student.setId(1);
        // 对学生姓名赋值
        student.setName("张三");
        // 对name赋值
        name = "tom";
        // 获取Map类型的request
        request = (Map<String, Object>) ActionContext.getContext().get("request");
    }
    // 请求处理方法
    @Override
    public String execute() throws Exception {
        // 向request添加值
        request.put("info", "request测试");
        // 返回SUCCESS
        return SUCCESS;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Student getStudent() {
        return student;
    }
    public void setStudent(Student student) {
        this.student = student;
    }
}

// struts.xml----------------------------------------------
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
    <!-- 声明常量 -->
    <constant name="struts.devMode" value="true"></constant>
    <package name="myPackage" extends="struts-default" namespace="/">
        <!-- 定义action -->
        <action name="ognl" class="com.lyq.action.OGNLAction">
            <!-- 结果映射 -->
            <result name="success">success.jsp</result>
        </action>
    </package>
</struts>

// success.jsp-------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OGNL操作普通属性</title>
</head>
<body>
    <div>
        <h1>操作普通属性</h1>
        属性name值:<s:property value="name"/>
        <br><hr>
        学号:<s:property value="student.id"/><br>
        <!-- 
        也可以使用<s:property value="student['id']"/>
        -->
        姓名:<s:property value="student.name"/><br>
        say()方法:<s:property value="student.say()"/>
        <br><hr>
        rquest中的inof值:<s:property value="#request['info']"/>
        <br>
        rquest中的inof值:<%= request.getAttribute("info") %>
    </div>
</body>
</html>

// index.jsp------------------------------
.........
<body>
<a href="ognl.action">测试</a>
</body>

拦截器

拦截器是个接口,代码如下:

public interface Interceptor extends Serializable{
    void destory();
    void init();
    String intercept(ActionInvocation invocation) throws Exception;

不好用,自己写拦截器时可以继承系统的拦截器抽象类AbstractInterceptor。

案例:为Action对象配置输出执行时间的拦截器,查看执行Action所学的时间。

将Struts2的包放入,配置web.xml在里面添加:
<!-- Struts2过滤器 -->
    <filter>
        <!-- 过滤器名称 -->
        <filter-name>struts2</filter-name>
        <!-- 过滤器类 -->
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <!-- Struts2过滤器映射 -->
    <filter-mapping>
        <!-- 过滤器名称 -->
        <filter-name>struts2</filter-name>
        <!-- 过滤器映射 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

// TestAction.java-----------------------------
package com.lyq.action;

import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    public String execute() throws Exception{
        // 线程睡眠1秒
        Thread.sleep(1000);
        return SUCCESS;
    }
}

// struts.xml---------------------
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <!-- 声明常量(开发模式) -->
    <constant name="struts.devMode" value="true" />
    <!-- 声明常量(在Struts2的配置文件修改后,自动加载) -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 声明包 -->
    <package name="myPackge" extends="struts-default">
        <!-- 配置Action -->
        <action name="testAction" class="com.lyq.action.TestAction">
            <!-- 配置拦截器,此处的timer拦截器是Struts的内置拦截器-->
            <interceptor-ref name="timer" />
            <!-- 配置返回页面 -->
            <result>success.jsp</result>
        </action>
    </package>
</struts>

//  index.jsp
<body>
<a href="testAction.action">测试</a>
</body>

// success.jsp
<body>
测试成功,请查看控制台程序的用时。
</body>

***注:执行Action所用时间可以在控制台看到。

案例:struts标签下的用户注册

将Struts2的包放入,配置web.xml在里面添加内容和上面的差不多。
//  UserAction.java
package com.lyq.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{
    private static final long serialVersionUID = 1L;
    // 用户名
    private String name;
    // 密码
    private String password;
    // 描述
    private String description;
    // 性别
    private int sex = 0;
    // 省份
    private String province;
    // 爱好
    private String[] hobby;

    // 用户注册
    public String execute() throws Exception {
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    。。。。。。。。。。。。。。。。。
    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
}

//  struts.xml
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <!-- 声明常量(开发模式) -->
    <constant name="struts.devMode" value="true" />
    <!-- 声明包 -->
    <package name="myPackge" extends="struts-default">
        <action name="userAction" class="com.lyq.action.UserAction">
            <result>success.jsp</result>
        </action>
    </package>
</struts>

// index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
........
<body>
    <h2>用户注册</h2>
    <s:form action="userAction" method="post">
        <s:textfield name="name" label="用户名" required="true" requiredposition="left"></s:textfield>
        <s:password name="password" label="密码" required="true" requiredposition="left"></s:password>
        <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别"  required="true" requiredposition="left"></s:radio>
        <s:select list="{'请选择省份','吉林','广东','山东','河南'}" name="province" label="省份"></s:select>
        <s:checkboxlist list="{'足球','羽毛球','乒乓球','蓝球'}" name="hobby" label="爱好"></s:checkboxlist>
        <s:textarea name="description" cols="30" rows="5" label="描述"></s:textarea>
        <s:submit value="注册"></s:submit>
        <s:reset value="重置"></s:reset>
    </s:form>
</body>

//  success.jsp
<body>
    <h3>恭喜您,注册成功!</h3>
    <ul>
        <li>用户名:<s:property value="name"/></li>
        <li>密码:<s:property value="password"/></li>
        <li>性别:<s:if test="sex==0">女</s:if><s:else>男</s:else></li>
        <li>省份:<s:property value="province"/></li>
        <li>爱好:<s:property value="hobby"/></li>
        <li>描述:<s:property value="description"/></li>
    </ul>
</body>

界面如图:
这里写图片描述

源码地址: https://pan.quark.cn/s/3916362e5d0a 在C#编程平台下,构建一个曲线编辑器是一项融合了图形用户界面(GUI)构建、数据管理及数学运算的应用开发任务。 接下来将系统性地介绍这个曲线编辑器开发过程中的核心知识点:1. **定制曲线面板展示数据曲线**: - 控件选用:在C#的Windows Forms或WPF框架中,有多种控件可用于曲线呈现,例如PictureBox或用户自定义的UserControl。 通过处理重绘事件,借助Graphics对象执行绘图动作,如运用DrawCurve方法。 - 数据图形化:通过线性或贝塞尔曲线连接数据点,以呈现数据演变态势。 这要求掌握直线与曲线的数学描述,例如两点间的直线公式、三次贝塞尔曲线等。 - 坐标系统与缩放比例:构建X轴和Y轴,设定坐标标记,并开发缩放功能,使用户可察看不同区间内的数据。 2. **在时间轴上配置多个关键帧数据**: - 时间轴构建:开发一个时间轴组件,显示时间单位刻度,并允许用户在特定时间点设置关键帧。 时间可表现为连续形式或离散形式,关键帧对应于时间轴上的标识。 - 关键帧维护:利用数据结构(例如List或Dictionary)保存关键帧,涵盖时间戳和关联值。 需考虑关键帧的添加、移除及调整位置功能。 3. **调整关键帧数据,通过插值方法获得曲线**: - 插值方法:依据关键帧信息,选用插值方法(如线性插值、样条插值,特别是Catmull-Rom样条)生成平滑曲线。 这涉及数学运算,确保曲线在关键帧之间无缝衔接。 - 即时反馈:在编辑关键帧时,即时刷新曲线显示,优化用户体验。 4. **曲线数据的输出**: - 文件类型:挑选适宜的文件格式存储数据,例如XML、JSON或...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值