zoukankan      html  css  js  c++  java
  • java框架篇---struts开发

    1.Token

    Token主要是以一种指令牌的形式进行重复提交处理的,在很多情况下,如果用户对同一个表单进行了多次提交,则有可能造成数据的混乱,此时,WEB服务器必须可以对这种重复提交的行为做出处理,例如:如果现在是一个用户注册的操作,如果用户已经提交了表单,而且服务器端已经对这次操作进行了成功的处理,而此时的用户通过浏览器执行了后退操作,并且重复进行表单提交时,服务器端就应该及时的识别出这些用户的错误操作,并进行错误处理,防止用户的重复提交。 
    编写首页,给出链接,并获得Token —— index.jsp
    <%@ page language="java" pageEncoding="GBK"%>
    <html>
    <head>
        <title>获得Token </title>
    </head>
    <body>
        <h3><a href="tokenforward.do">获取Token,输入数据</a></h3>
    </body>
    </html>

    编写ActionForm —— TokenforwardForm.java

    package org.lxh.struts.form;
    import javax.servlet.http.HttpServletRequest;
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;
    public class TokenforwardForm extends ActionForm {
        public ActionErrors validate(ActionMapping mapping,
                HttpServletRequest request) {
            return null;
        }
        public void reset(ActionMapping mapping, HttpServletRequest request) {
        }
    }

    定义接收输入数据的Action —— InputAction.java

    package org.lxh.struts.action;
    import org.lxh.struts.form.InputForm;
    public class InputAction extends Action {
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) {
            InputForm inputForm = (InputForm) form;
            if (super.isTokenValid(request)) {     // 如果设置的Token正确,则输出内容
                System.out.println("输入内容:" + inputForm.getInfo());
                super.resetToken(request);         // 取消设置的Token
            } else {                                         // 没有Token,应该进行错误显示
                ActionMessages errors = new ActionMessages();     // 设置错误信息保存
                errors.add("token", new ActionMessage("error.token")); // 设置错误内容
                this.saveErrors(request, errors);         // 保存错误信息
                return mapping.getInputForward();        // 返回到错误页
            }
            return null;
        }
    }

    修改struts-config.xml配置文件 

    <form-beans>
            <form-bean name="tokenforwardForm"
                type="org.lxh.struts.form.TokenforwardForm" />
            <form-bean name="inputForm"
                type="org.lxh.struts.form.InputForm" />
        </form-beans>
        <action-mappings>
            <action attribute="tokenforwardForm" input="/ch17/input.jsp"
                name="tokenforwardForm" path="/ch17/tokenforward" scope="request"
                type="org.lxh.struts.action.TokenforwardAction">
                <forward name="input" path="/ch17/input.jsp"></forward>
            </action>
            <action attribute="inputForm" input="/ch17/input.jsp"
                name="inputForm" path="/ch17/input" scope="request"
                type="org.lxh.struts.action.InputAction" />
        </action-mappings>

    编写资源文件,添加错误信息 —— ApplicationResources.properties

    # 请不要重复提交!
    error.token = u8bf7u4e0du8981u91cdu590du63d0u4ea4uff01
     

    2.文件上传

    • 掌握Struts文件上传的基本操作原理;
    • 可以使用Struts完成文件的上传功能实现。

    文件上传

    在WEB项目中文件上传是一个必不可少的操作,前面介绍过两种上传组件的使用,分别是SmartUpload、FileUpload,这两种组件相比较起来SmartUpload更加的容易,而FileUpload却较为复杂,幸运的是在Struts中也对文件上传有所支持,而且上传使用的组件就是FileUpload,但是此时的使用比起直接使用FileUpload就要方便许多了。
    如果要想正确的使用FileUpload组件完成操作,还需要依靠<html:file>标签完成,此标签核心语法如下所示:
    <html:file property="对应ActionForm中的属性名称"/>

    FormFile类的常用方法

    No.

    方法

    类型

    描述

    1

    public byte[] getFileData() throws FileNotFoundException,IOException

    普通

    取得上传文件大小

    2

    public InputStream getInputStream() throws FileNotFoundException,IOException

    普通

    取得上传文件的输入流

    3

    public int getFileSize()

    普通

    取得上传文件的大小

    4

    public String getFileName()

    普通

    取得上传文件的名称

    5

    public String getContentType()

    普通

    取得上传文件的类型

    定义表单 —— upload.jsp

    <%@ page language="java" pageEncoding="GBK"%>
    <%@ taglib uri="http://www.mldn.cn/struts/bean" prefix="bean"%>
    <%@ taglib uri="http://www.mldn.cn/struts/html" prefix="html"%>
    <%@ taglib uri="http://www.mldn.cn/struts/logic" prefix="logic"%>
    <html:html lang="true">
    <head>
        <title>文件上传</title>
    </head>
    <body>
        <html:form action="/ch17/upload.do" method="post" enctype="multipart/form-data">
            请选择要上传的文件;<html:file property="photo"/>
            <html:submit value="上传"></html:submit>
        </html:form>
    </body>
    </html:html>

    定义ActionForm,接收上传文件 —— UploadForm.java

    package org.lxh.struts.form;
    import javax.servlet.http.HttpServletRequest;
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.upload.FormFile;
    public class UploadForm extends ActionForm {
        private FormFile photo ;            // 接收上传文件
        public ActionErrors validate(ActionMapping mapping,
                HttpServletRequest request) {        // 暂不验证
            return null;
        }
        public void reset(ActionMapping mapping, HttpServletRequest request) {
        }
        public FormFile getPhoto() {
            return photo;
        }
        public void setPhoto(FormFile photo) {
            this.photo = photo;
        }
    }

    定义Action —— UploadAction.java

    public class UploadAction extends Action {
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) {
            UploadForm uploadForm = (UploadForm) form;
            IPTimeStamp its = new IPTimeStamp(request.getRemoteAddr()); // 自动生成文件名
            String fileName = its.getIPTimeRand()
                    + "."
                    + uploadForm.getPhoto().getFileName().split("\.")[uploadForm
                        .getPhoto().getFileName().split("\.").length - 1];// 生成文件名
            File outFile = new File(super.getServlet().getServletContext()
                    .getRealPath("/") + "upload"+ File.separator
                    + uploadForm.getPhoto().getFileName().split("\."));    // 输出文件路径
            try{
                OutputStream output = new FileOutputStream(outFile) ;        // 文件输出
                byte data[] = new byte[1024] ;        // 接收文件
                int temp = 0 ;            // 结束判断
                while ((temp = uploadForm.getPhoto().getInputStream()
                        .read(data, 0, 1024)) != -1) {    // 分块保存
                    output.write(data) ;            // 保存文件
                }
                output.close() ;        // 关闭输出
            }catch(Exception e){
                e.printStackTrace() ;        // 错误输出
            }
            return null;
        }
    }

    配置struts-config.xml文件 

    <struts-config>
        <form-beans>
            <form-bean name="uploadForm" type="org.lxh.struts.form.UploadForm" />
        </form-beans>
        <action-mappings>    
            <action attribute="uploadForm" input="/upload.jsp"
                name="uploadForm" path="/upload" scope="request"
                type="org.lxh.struts.action.UploadAction" />
        </action-mappings>
    </struts-config>

    这样就可以很方便的完成文件上传操作。

    3.怎么配置动态ActionForm?

    在正常操作中,每一个Action必须对应一个ActionForm,但是这样一来就会造成ActionForm过多的情况,所以为了解决此类问题,在Struts中专门提供了动态ActionForm,以解决ActionForm过多的问题。
    动态ActionForm对应的操作类是:org.apache.struts.action.DynaActionForm,使用此类时,不需要定义具体的类,只需要在struts-config.xml文件中配置即可。 

    配置一个动态ActionForm,包含两个属性 —— struts-config.xml

    <struts-config>
        <form-beans>
            <form-bean name="newsForm" 
                type="org.apache.struts.action.DynaActionForm">
                <form-property name="title" type="java.lang.String">
                </form-property>
                <form-property name="content" type="java.lang.String">
                </form-property>
            </form-bean>
        </form-beans>
        <action-mappings>    
            <action attribute="newsForm" input="/ch17/news.jsp"
                name="newsForm" path="/ch17/news" scope="request"
                type="org.lxh.struts.action.NewsAction" />
        </action-mappings>
    </struts-config>

    定义输入表单 —— news.jsp

    <%@ page language="java" pageEncoding="GBK"%>
    <%@ taglib uri="http://www.mldn.cn/struts/bean" prefix="bean"%>
    <%@ taglib uri="http://www.mldn.cn/struts/html" prefix="html"%>
    <%@ taglib uri="http://www.mldn.cn/struts/logic" prefix="logic"%>
    <html:html lang="true">
    <head>
        <title>动态actionForm</title>
    </head>
    <body>
        <html:form action="/ch17/news.do" method="post">
            标题:<html:text property="title"/><br>
            内容:<html:text property="content"/><br>
            <html:submit value="提交"/><html:reset value="重置"/>
        </html:form>
    </body>
    </html:html>

    接收参数 —— NewsAction.java

    package org.lxh.struts.action;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.action.DynaActionForm;
    public class NewsAction extends Action {
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) {
            DynaActionForm dynaForm = (DynaActionForm) form ;
            String title = dynaForm.getString("title") ;    // 取得title输入内容
            String content = dynaForm.getString("content") ;    // 取得content输入内容
            System.out.println("title --> " + title) ;        // 输出title内容
            System.out.println("content --> " + content);    // 输出content内容
            return null;
        }
    }
    动态ActionForm依靠配置完成,可以解决ActionForm过多的问题,但是ActionForm本身依然属于Struts的最大弱点。
  • 相关阅读:
    Virtio:针对 Linux 的 I/O 虚拟化框架
    修复MySQL的MyISAM表命令check table用法
    Linux 下用 smartd 监测硬盘状况
    借助JVM生日的时机,说说关于JVM你所不知道的那些事
    实时流计算、Spark Streaming、Kafka、Redis、Exactly-once、实时去重
    使用Kafka、Elasticsearch、Grafana搭建业务监控系统(三)Elasticsearch
    zabbix监控多实例tomcat--不使用JMX
    KAFKA随机产生JMX 端口指定的问题
    nginx+keepalived高可用服务器宕机解决方案
    tomcat 内存参数优化示例
  • 原文地址:https://www.cnblogs.com/oumyye/p/4344867.html
Copyright © 2011-2022 走看看