struts2知识

一、 MVC

Ø Model 1将所有的程序代码,都写到JSP页面中。

Ø Model 2:JSP(流程控制、数据显示) + JavaBean

Ø 改进的Model2:Servlet(流程控制) + Jsp(数据显示) + JavaBean(业务逻辑、数据处理)

Ø MVC:将整个应用程序划分为3大组件(Model、View、Controller

注意:MVC和三层不是一回事。

二、 Struts2简介

struts2是一个典型的MVC框架。

struts2 = Struts1 + WebWork

struts2下载包的目录结构:apps(示例程序)docs(帮助文档)、libjar包)、src(源码)


一、 Struts2项目的开发流程

1. 创建web项目

2. 导入struts2相关的Jar

提示:可以解压apps目录下的struts-blank.war,从它的lib目录中拷贝相关的jar

3. 在web.xml文件中配置struts2的核心控制器(过滤器)

<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>

4. 在src中添加struts.xml文件

5. 创建Action类,并添加Action方法

方式一:实现接口Action

常量:INPUT(input)SUCCESS(success)ERROR(error)LOGIN(login)NONE(none)

方式二:继承类ActionSupport

方式三:POJO

6. 在struts.xml文件中配置action节点

7. 编写JSP页面

一、 struts.xml配置详解

1. struts2的常量,可以在struts.xmlconstant中设置,也可以单独写到struts.properties中。

2. result节点的type属性

Ø dispatcher:转发(JSP),默认值

Ø redirect:重定向(JSP或外部url

Ø redirectAction:重定向到其他的action

Ø chain:转发到其他的action

Ø stream:文件下载

Ø jsonajax请求时,一般以json格式串返回

3. 常见配置介绍

l resultname属性可以省略,默认值为success

l resulttype属性可以省略,默认值为dispatcher

用户访问的url地址,为namespace+actionName

<?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>

<!-- 设置struts2的常量 -->

<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

<!-- 可以有多个package节点 -->

<!-- name:每个packagename值都不能相同,必填

 namespace:命名空间(URL地址的一部分)

 extends:一般都要继承struts-default包  -->

<package name="default" namespace="/" extends="struts-default">

<!-- 结果类型 -->

<result-types>

<result-type name="" class=""></result-type>

</result-types>

<!-- interceptors用户声明所有的拦截器 -->

<interceptors>

<!-- interceptor声明拦截器 -->

<interceptor name="" class=""></interceptor>

<!-- 配置拦截器栈(多个拦截器可以构成拦截器栈) -->

<interceptor-stack name="">

<!-- 引用的拦截器,可以是一个拦截器栈 -->

<interceptor-ref name="defaultStack"></interceptor-ref>

</interceptor-stack>

</interceptors>

<!-- 配置默认的拦截器 -->

<default-interceptor-ref name=""></default-interceptor-ref>

<!-- 默认的action。当用户在浏览器地址栏中没有输入任何action时,将访问本节点配置的action -->

<!-- http://localhost:8080/projectname/ -->

<default-action-ref name="login"></default-action-ref>

<!-- 默认的action类(当action节点省略时,将使用本节点配置的类) -->

<default-class-ref class=""></default-class-ref>

<!-- 全局的result -->

<global-results>

<result name="login" type="dispatcher">/login.jsp</result>

<result name="error" type="dispatcher">/error.jsp</result>

</global-results>

<!-- 全局的异常映射 -->

<global-exception-mappings>

<exception-mapping result="error" exception="Java.lang.Exception"></exception-mapping>

<exception-mapping result="error" exception="java.sql.SQLException"></exception-mapping>

<exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>

</global-exception-mappings>

<!-- action可以有多个(name必填;classmethod可以省略;method如果省略默认为execute) -->

<action name="login" class="" method="">

<!-- name可以省略,默认值为successtype可以省略,默认值是dispatcher -->

<result name="" type=""></result>

</action>

</package>

<!-- 导入其他的struts配置文件,不管有多少个struts的配置文件,struts2框架而言,只会加载struts.xml,所有需要将其他的配置文件导入到struts.xml文件中 -->

<include file=""></include>

</struts>

二、 拦截器

1. 定义拦截器

实现接口:Interceptor

继承类:AbstractInterceptor

2. 配置拦截器

首先,在Interceptors节点下添加Interceptor节点;

其次,要么在action中通过interceptor-ref使用拦截器,要么配置default-interceptor-ref

3. 注意

一旦使用了自定义的拦截器,那么struts2提供的默认的拦截器defaultStack将不再起作用。

怎么破?新添加一个拦截器栈,里面添加对自定义拦截器和defaultStack的引用,然后将这个拦截器栈设置为默认的拦截器。

4. struts2提供的拦截器

params拦截器

validation拦截器

fileUpload拦截器

workflow拦截器

… …

三、 文件上传

1. jsp页面的form标记,method属性值必须为post

2. jsp页面的form标记,必须添加enctype=multipart/form-data属性

3. jsp页面中使用type=file的文件域

4. 添加apache文件上传的jar包:commons-fileuploadcommons-io

5. 在Action类中添加三个属性:

private  File  xxx;

private  String  xxxFileName;

private  String  xxxContentType;

6. 在action方法中实现文件的保存

避免文件名重名时文件被覆盖:uuid作为文件名

数据库中存储的文件路径一定要是相对路径

如何获取项目中指定目录的绝对路径

String path = ServletActionContext.getServletContext().getRealPath(“files”);

7. 限制文件大小和文件类型

通过设置fileUpload拦截器的参数即可实现。

maximumSize:限制文件上传的大小

allowedTypes:限制文件上传的类型

<constant name="struts.multipart.maxSize" value="1024000"></constant>

<interceptor-ref name="fileUpload">

<!--配置允许上传的文件类型-->

<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>

<!--配置允许上传的文件大小单位字节-->

<param name="maximumSize">5242880</param>

</interceptor-ref>

8. 多文件上传

只需要将action中的那三个属性设置为数组即可

private  File[]  xxx;

private  String[]  xxxFileName;

private  String[]  xxxContentType;

四、 文件下载

1. 在action中必须存在一个InputStream类型的属性,并且该属性具有get方法

2. 在struts.xmlactionresult节点中,type属性值为stream

<result name=”xxx” type=”stream”>

  <param name=”contentType”></param>

<param name=”inputName”>类型为inputstream的属性名</param>

<param name=”contentDisposition”>

  attachment;filename=”${fileName}”

</param>

</stream>

 

五、  struts2中如何使用servlet api

1. 方式一(耦合)

HttpServletRequest request = ServletActionContext.getRequest();

HttpSession session = ServletActionContext.getRequest.getSession();

HttpServletResponse response = ServletActionContext.getResponse();

ServletContext application = ServletActionContext.getServletContext();

2. 方式二(非耦合)

Map<String, Object> request = (Map<String, Object>) ActionContext.getContext().get(“request”);

Map<String, Object> session = ActionContext.getContext().getSession();

Map<String, Object> application = ActionContext.getContext().getApplication();

3. 方式三(非耦合)

让Action类实现接口:RequestAwareSessionAwareApplicationAware

六、 OGNL

1. ognl:对象图导航语言

2. ognlel相似,都是用来简化jsp中的java代码

3. ongl可以从2个地方获取数据

Ø ValueStack:值栈。一般值栈中只会存放当前Action类的对象。

Ø ActionContextapplicationsessionrequestpageContextparametersattr

注意:值栈中的数据可以直接通过名字获取;但是ActionContext中的数据则需要添加前缀#

#application

#session

#request

#pageContext

#paramteters

#attr

其中attr表示依次从pageContextrequestsessionapplication中获取数据。

七、 struts2的标签

1. jstl- JSP标准标签库

Ø 核心标签

forEachchoosewhenotherWiseif

Ø 格式化标签

formatDateformatNumber

2. struts2提供的标签

formiteratorifelseselectcheckboxcheckboxlistradiofielderror

八、 数据校验

1. 客户端验证

通过JavaScript脚本验证用户数据是否合法

<form>

  <input type=”submit” value=”save Data” οnclick=”return checkFormData();” />

</form>

<script type=”text/javascript”>

function checkFormData(){

  … …

  return true|false;

}

</script>

注意:客户端验证是不安全的。用户可以通过禁用js脚本让js代码失效;用户也可以使用HttpRequest来模拟用户请求来避免js验证。

2. 服务器端验证

服务器端的验证不能省。

如果没有通过数据校验,那么默认返回input

如果数据类型转换失败了,那么仍然会执行数据校验。

如果没有通过数据校验,那么肯定不再执行目标action方法。

Ø 重写父类ActionSupportvalidate方法

该Action类中所有的action方法都会被验证。

Ø 在Action类中添加验证方法validateXxx方法

该验证方法只对xxx方法起作用。

Ø 在Action类同一个包中添加xml验证文件

只对特定的action方法起作用。最大的好处就是不用再编写java验证代码。

验证文件的格式:ActionClassName-actionAlias-validation.xml

struts2内置的校验器:

l required:必填校验器

l requiredstring:必填字符串校验器(trim)

l int:整数校验器

l stringlength:字符串长度校验器(minLengthmaxLength)

l regex:正则表达式校验器

l date:日期校验器

l double:双精度校验器

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

        "-//Apache Struts//XWork Validator 1.0.2//EN"

        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>

<field name="user.userName">

<field-validator type="requiredstring">

<param name="trim">true</param>

<message>用户名不能为空</message>

</field-validator>

<field-validator type="stringlength">

<param name="minLength">6</param>

<param name="maxLength">10</param>

<message>用户长度必须介于${minLength}-${maxLength}之间</message>

</field-validator>

</field>

<field name="user.password">

<field-validator type="requiredstring">

<param name="trim">true</param>

<message>密码不能为空</message>

</field-validator>

</field>

<field name="user.phone">

<field-validator type="requiredstring">

<param name="trim">true</param>

<message>手机号不能为空</message>

</field-validator>

<field-validator type="regex">

<param name="regex">^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$</param>

<message>手机号码格式错误</message>

</field-validator>

</field>

</validators>

九、 国际化

1. 国际化

同一套应用程序,针对不同语系、不同地区的用户显示特定的语言文字。

zh-CNzh-HKzh-TWen-US

2. 本地化

针对不同语系、不同地区添加不同的资源文件

3. struts2中如何实现国际化

首先,在struts.xml文件中配置常量

<constant name="struts.custom.i18n.resources" value="message"></constant>

其次,添加名称为message的资源文件

message_zh_CN.properties

message_en.properties

message.properties

最后,在JSP页面中使用s:text来显示文字,在数据验证文件中使用<message key=”key”>

十、 ajax

1. ajax的定义

异步的javascriptxml

2. ajax的作用

异步请求,局部刷新

3. ajax基本概念

ajax不是一种单独的技术,它涉及javascriptcssXMLHttpRequest等。它的核心组件是XMLHttpRequest,但是不同的浏览器对XMLHttpRequest的支持不同,所以在创建它的对象时,要分别对浏览器做出判断。因此在实际开发过程中,我们很少编写原生的ajax代码,而是使用jQuery等框架提供的ajax函数来快速实现ajax效果。

4. XMLHttpRequest

l open(method, url, async)

methodget|post请求发送的类型

l onreadystatechange

请求状态改变事件,需要挂载function

readyState==4    status==200   表示成功

l send(data)

向服务器正式发送请求

5. jquery提供的ajax函数

l load(url)

加载指定url请求的结果

l $.get(url, parameter, callback, type)

以get方式向服务器发送请求

url:请求的地址

parameter:请求的参数,一般是json格式的对象{id:5, name:”zhangsan”}

callback:回调函数function(data){},其中data代表服务器返回的结果

typetext|json|html|xml

l $.post(url, parameter, callback, type)

以post方式向服务器发送请求。参数同$.get一样。

l $.getJSON(url, parameter, callback)

以get方式向服务器发送请求。返回的结果为json格式。

l $.ajax({})

最底层的ajax函数。上面的所有函数都可以通过本函数实现。

$.ajax({

urlurl地址,

type: “get|post”,

data:{id:5, name:”zhangsan”},

dataType: “json”,

success:  function(data){},

error: function(xhr){}

});

转载于:https://www.cnblogs.com/ws1313123/p/6424721.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 数据修改时间_怎样修改mysql数据中的具体时间

匿名用户1级2016-12-30 回答应用场景&#xff1a;1、在数据表中&#xff0c;要记录每条数据是什么时候创建的&#xff0c;不需要应用程序去特意记录&#xff0c;而由数据数据库获取当前时间自动记录创建时间&#xff1b;2、在数据库中&#xff0c;要记录每条数据是什么时候修改…

sql插入临时表数据的方法

方法有两种&#xff0c;主要看需求。 方法1&#xff1a;定义好临时表的字段和类型、插入对应的值 create table #Tmp --创建临时表#Tmp (City varchar(50), --Country varchar(50), -- );insert #Tmp select 北京,中国 union select 东京,日本 union select 纽约,美国 se…

mysql冷热备_Mysql的冷备热备(数据备份)

冷备可以是mysql工具 msqldump。mysqldump -u username -p dbname table1 table2 ... -> BackupName.sqldbname 数据库名称table1 table2 是表名称BackupName.sql 备份保存的相对路径的sql文件执行下面命令。mysqldump -u homestead -psecret homestead > /home/vagrant/…

拼图项目:一个不完整的难题

马克雷因霍尔德&#xff08;Mark Reinhold&#xff09;最近提议延迟Java 9&#xff0c;以花更多的时间来完成Jigsaw项目&#xff0c;这是即将发布的版本的主要功能。 虽然这个决定肯定会使Java的厄运论者重回舞台&#xff0c;但我个人感到很放心&#xff0c;并认为这是一个很好…

gulp

1.gulp是什么&#xff1f; gulp是前端开发过程中一种基于流的代码构建工具&#xff0c;是自动化项目的构建利器&#xff1b;她不仅能对网站资源进行优化&#xff0c;而且在开发过程中很多重复的任务能够使用正确的工具自动完成&#xff1b;使用她&#xff0c;不仅可以很愉快的编…

往vxe-table添加渲染器怎么添_赚大了!飘窗上装书桌,加扇折叠窗,等于为家里又多添一间房...

阅读本文前&#xff0c;请您先点击上面蓝色字体&#xff0c;再点关 注这样您就可以继续免费收到文章注&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系我们进行删除&#xff0c;谢谢&#xff01; …

Kubernetes资源创建yml语法

前言 在是用kubernetes中&#xff0c;我们对资源的创建大部分都是通过 1kubelet create -f RESOURCE.yaml刚开看的时候不免有一些迷茫&#xff0c;看不懂语法&#xff0c;不知道怎么写&#xff1b;今天本文就介绍一下kubernetes construct语法。 Construct语法其实就是由kubele…

【六大排序详解】中篇 :选择排序 与 堆排序

选择排序 与 堆排序 选择排序 选择排序 与 堆排序1 选择排序1.1 选择排序原理1.2 排序步骤1.3 代码实现 2 堆排序2.1 堆排序原理2.1.1 大堆与小堆2.1.2 向上调整算法2.1.3 向下调整算法 2.2 排序步骤2.3 代码实现 3 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#…

java中contains的用法_java容器中所有接口和类的用法

我这里讲一下如何下载java的api文档还有就是容器和容器之间进行的操作每一个地方称之为一个节点&#xff0c;每一个节点包含了3部分(上一个节点&#xff0c;下一个节点&#xff0c;以及我们自己的数据部分)需要多个线程共享的时候通过键对象来找值对象1 java中的length属性是针…

lcs文本相似度_具有LCS方法的通用文本比较工具

lcs文本相似度常见的问题是检测并显示两个文本的差异&#xff08;尤其是几百行或几千行&#xff09;。 使用纯java.lang.String类方法可能是一种解决方案&#xff0c;但是对于此类操作最重要的问题是&#xff0c;“性能”将不能令人满意。 我们需要一种有效的解决方案&#xff…

MySQL--开发技巧(一)

Inner Join: Left Outer Join: Right Outer Join: Full Join: Cross Join&#xff1a; SELECT t1.attrs ,t2.attrs FROM t1 CROSS JOIN t2 使用Join更新表&#xff1a; UPDATE table1 SET attr2 WHERE attr1 IN (SELECT table2.attr1 FROM table1 INNER JOIN table2 ON tab…

查看mysql 中建立的表空间_mysql 表空间及索引的查看

1.查看索引(1)单位是GBSELECT CONCAT(ROUND(SUM(index_length)/(1024*1024*1024), 2), GB) AS Total Index Size FROM information_schema.TABLES WHERE table_schema LIKE database;------------------| Total Index Size |------------------| 1.70 GB |------------------(…

Java EE,Gradle和集成测试

在过去的几年中&#xff0c;Apache Maven已成为Java和Java EE项目的事实上的构建工具。 但是从两年前开始&#xff0c; Gradle便获得了越来越多的用户。 在我之前的文章&#xff08; http://www.lordofthejars.com/2015/10/gradle-and-java-ee.html &#xff09;之后&#xff0…

CSS 优化、提高性能的方法

如何提高CSS性能&#xff0c;根据页面的加载性能和CSS代码性能&#xff0c;主要总结有下面几点&#xff1a; 1、尽量将样式写在单独的css文件里面&#xff0c;在head元素中引用 有时候为了图方便或者快速搞定功能&#xff0c;我们可能会直接将样式写在页面的style标签或者直接内…

js url解码gbk_使用js解码gbk编码的字符串

如下字符串为 “产后恢复肚子”%B2%FA%BA%F3%BB%D6%B8%B4%B2%D9%CA%D3%C6%B5%BD%CC%B3%CC直接使用js的解码函数解码得到的都是乱码,可以使用下面的函数进行解码/*** js解码gbk url编码的字符串* param {[type]} str gbk编码字符串* param {[type]} charset 字符串的…

使用Mongo索引需要注意的几个点

1、正则表达式和取反运算符不适合建立索引 正则表达式&#xff1a;$regex 取反运算符&#xff1a;$ne &#xff0c;$nin 2、backgroud建立索引速度缓慢 前台创建是会有阻塞&#xff0c;backgroud效率缓慢&#xff0c;实际情况实际分析 3、mongo支持存储数组&#xff0c;并可将数…

play 打包 模块_编写Play 2的模块,第1部分:使工作正常

play 打包 模块几周前&#xff0c;我迁移了Play&#xff01; 框架 1.x版本的Deadbolt应用于Play 2平台&#xff0c;并且对缺少有关创建模块的信息感到惊讶。 Play 1.x文档中详细介绍了该主题&#xff0c;这使得创建模块非常简单。 显然&#xff0c;需要做些事情-这是关于为Play…

redhat6.8链路聚合

centos 6.X 聚合链路0、查看NetworkManager服务&#xff0c;停止NetworkManager服务。不做这一步很可能出问题 service NetworkManager status service NetworkManager stop1、修改三类文件 /etc/sysconfig/network-scripts/下的ifcfg-*文件 …

mysql 5.7 insert_MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器

在MySQL5.6版本里&#xff0c;不支持一个表有多个INSERT/DELETE/UPDATE触发器。例如创建t1表两个INSERT的触发器&#xff1a;DELIMITER $$USE test$$DROP TRIGGER /*!50032 IF EXISTS */ t1_1$$CREATE/*!50017 DEFINER ‘admin‘‘%‘ */TRIGGER t1_1 AFTER INSERT ON t1FOR E…

Java回调机制解读

模块间调用 在一个应用系统中&#xff0c;无论使用何种语言开发&#xff0c;必然存在模块之间的调用&#xff0c;调用的方式分为几种&#xff1a; &#xff08;1&#xff09;同步调用 同步调用是最基本并且最简单的一种调用方式&#xff0c;类A的方法a()调用类B的方法b()&#…