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 = \u8bf7\u4e0d\u8981\u91cd\u590d\u63d0\u4ea4\uff01
 

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的最大弱点。

java框架篇---struts开发的更多相关文章

  1. java框架篇---Struts入门

    首先理解Struts与MVC的关系 在传统的MVC模式中所有的请求都要先交给Servlet处理,之后由Servlet调用JavaBean,并将结果交给JSP中进行显示.结构图如下 Struts是Apa ...

  2. java框架篇---struts之文件上传和下载

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

  3. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

  4. java框架篇---struts实现拦截器

    Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept ...

  5. java框架篇---spring IOC 实现原理

    IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...

  6. java框架篇---Struts2的处理流程

    一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是 ...

  7. Java框架篇---Mybatis 入门

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果.MyBatis ...

  8. java框架篇---spring hibernate整合

    在会使用hibernate 和spring框架后 两个框架的整合就变的相当容易了, 为什么要整合Hibernate?1.使用Spring的IOC功能管理SessionFactory对象 LocalSe ...

  9. Java框架中Struts和Struts2框架的区别

    struts1 与 struts2 的区别:1.都是 MVC 的 WEB 框架,2 struts1的老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本更低!struts2虽然基于这个框架 ...

随机推荐

  1. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  2. 《JAVA与模式》之单例模式(转载)

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿 ...

  3. 【转】Tesla autopilot 引起致命车祸

    Tesla autopilot 引起致命车祸 好一段时间没关心 Tesla 了,今天才发现他们的 autopilot 终于引起了致命的车祸.这场 Model S 撞上18轮大卡车的车祸,发生于5月7号 ...

  4. SharePoint CAML In Action——Part I

    在SharePoint中,我们经常要对List进行操作,比如要从List中取出相应的ListItem,利用CAML是个好办法.在没了解CAML之前,我是这样取数据的: MyList.Items.Cas ...

  5. df -h和du -sh显示结果不一样的原因及解决

    一.背景:一台2T硬盘的mysql服务器,保存电话的CDR信息.按照历史数据的水平,一个月能生成20+GB的文件.然而短短的半年时间,满了?! 登录服务器看谁占了这么大的空间?好吧,slow-quer ...

  6. ELK 中的elasticsearch 集群的部署

    本文内容 背景 ES集群中第一个master节点 ES slave节点 本文总结 Elasticsearch(以下简称ES)搭建集群的经验.以 Elasticsearch-rtf-2.2.1 版本为例 ...

  7. SpringBoot+mybatis实现多数据源支持

    什么是多数据源支持? 简单的说,就是一个项目里,同时可以访问多个不同的数据库. 实现原理 单个数据源在配置时会绑定一套mybatis配置,多个数据源时,不同的数据源绑定不同的mybatis配置就可以了 ...

  8. 使用gradle多渠道打包

    以友盟的多渠道打包为例,如果我们须要打包出例如以下渠道:UMENG, WANDOUJIA, YINGYONGBAO. 第一种方法.是须要创建文件的. 我们在写完我们的代码之后,在app/src以下.分 ...

  9. iOS提交iTunes审核时出现Invalid Binary错误

    xcode5编译一个xcode4时写的代码,提交iTunes审核时出错. 1.iOS提交审核时出现Invalid Binary错误 2.收到邮件: iPhone 5 Optimization Requ ...

  10. 【Unity】9.3 粒子系统生成器详解

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 上一节已经介绍过了在Unity 5.x中两种创建粒子效果的方式(方式1.方式2). 这一节我们主要学习第2种方式的基本概 ...