一、 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(帮助文档)、lib(jar包)、src(源码)

三、 Struts2项目的开发流程

  1. 创建web项目
  2. 导入struts2相关的Jar包

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

  1. 在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>

  1. 在src中添加struts.xml文件
  2. 创建Action类,并添加Action方法

l 方式一:实现接口Action

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

l 方式二:继承类ActionSupport

l 方式三:POJO类

  1. 在struts.xml文件中配置action节点
  2. 编写JSP页面

四、 struts.xml配置详解

  1. struts2的常量,可以在struts.xml的constant中设置,也可以单独写到struts.properties中。
  2. result节点的type属性
  • dispatcher:转发(JSP),默认值
  • redirect:重定向(JSP或外部url)
  • redirectAction:重定向到其他的action
  • chain:转发到其他的action
  • stream:文件下载
  • json:ajax请求时,一般以json格式串返回
  1. 常见配置介绍

l result的name属性可以省略,默认值为success

l result的type属性可以省略,默认值为dispatcher

l 用户访问的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:每个package的name值都不能相同,必填

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必填;class和method可以省略;method如果省略默认为execute) -->

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

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

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

</action>

</package>

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

<include file=""></include>

</struts>

五、 拦截器

  1. 定义拦截器

实现接口:Interceptor

继承类:AbstractInterceptor

  1. 配置拦截器

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

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

  1. 注意

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

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

  1. 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-fileupload、commons-io
  5. 在Action类中添加三个属性:

private  File  xxx;

private  String  xxxFileName;

private  String  xxxContentType;

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

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

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

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

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

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

通过设置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>

  1. 多文件上传

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

private  File[]  xxx;

private  String[]  xxxFileName;

private  String[]  xxxContentType;

七、 文件下载

  1. 在action中必须存在一个InputStream类型的属性,并且该属性具有get方法
  2. 在struts.xml的action的result节点中,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();

  1. 方式二(非耦合)

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();

  1. 方式三(非耦合)

让Action类实现接口:RequestAware、SessionAware、ApplicationAware

九、 OGNL

  1. ognl:对象图导航语言
  2. ognl和el相似,都是用来简化jsp中的java代码
  3. ongl可以从2个地方获取数据
  • ValueStack:值栈。一般值栈中只会存放当前Action类的对象。
  • ActionContext:application、session、request、pageContext、parameters、attr。

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

#application

#session

#request

#pageContext

#paramteters

#attr

其中attr表示依次从pageContext、request、session、application中获取数据。

十、 struts2的标签

  1. jstl- JSP标准标签库
  • 核心标签

forEach、choose、when、otherWise、if

  • 格式化标签

formatDate、formatNumber

  1. struts2提供的标签

form、iterator、if、else、select、checkbox、checkboxlist、radio、fielderror

十一、 数据校验

  1. 客户端验证

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

<form>

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

</form>

<script type=”text/javascript”>

function checkFormData(){

… …

return true|false;

}

</script>

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

  1. 服务器端验证

服务器端的验证不能省。

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

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

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

  • 重写父类ActionSupport的validate方法

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

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

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

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

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

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

struts2内置的校验器:

l required:必填校验器

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

l int:整数校验器

l stringlength:字符串长度校验器(minLength、maxLength)

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-CN、zh-HK、zh-TW、en-US、

  1. 本地化

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

  1. 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的定义

异步的javascript和xml。

  1. ajax的作用

异步请求,局部刷新

  1. ajax基本概念

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

  1. XMLHttpRequest

l open(method, url, async)

method:get|post请求发送的类型

l onreadystatechange

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

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

l send(data)

向服务器正式发送请求

  1. jquery提供的ajax函数

l load(url)

加载指定url请求的结果

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

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

url:请求的地址

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

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

type:text|json|html|xml

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

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

l $.getJSON(url, parameter, callback)

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

l $.ajax({})

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

$.ajax({

url:url地址,

type: “get|post”,

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

dataType: “json”,

success:  function(data){},

error: function(xhr){}

});

struts2知识点复习的更多相关文章

  1. Spring知识点复习

    Spring知识点复习 一.专业术语 侵入式设计 引入框架,对现有的类的结构有影响,即需要实现或继承某些特定类.如:Struts框架 非侵入式设计 引入框架,对现有的类结构没有影响.如:Hiberna ...

  2. Hybrid App 应用开发中 9 个必备知识点复习(WebView / 调试 等)

    前言 我们大前端团队内部 ?每周一练 的知识复习计划继续加油,本篇文章是 <Hybrid APP 混合应用专题> 主题的第二期和第三期的合集. 这一期共整理了 10 个问题,和相应的参考答 ...

  3. python类,魔术方法等学习&&部分ssti常见操作知识点复习加深

    python类学习&&部分ssti常见操作知识点复习加深 在做ssti的模块注入的时候经常觉得自己python基础的薄弱,来学习一下,其实还是要多练习多背. 在python中所有类默认 ...

  4. C语言知识点复习梳理

    C语言知识点复习梳理 C语言的知识点讲完了,接下来就是做一下整理与总结,然后就会进入其他知识的学习. 本文目录如下: 基础知识. 顺序程序设计. 数据类型. 标准输入输出. 进制转换. 选择结构. 循 ...

  5. Struts2知识点学习笔记

    写给自己的话 好记性不如烂笔头,不可能说看了一遍视频就可以完全掌握的.留下这篇笔记,便于今后的复习吧. 1. 访问ServletAPI 访问ServletAPI(response,request,)的 ...

  6. JSOI2020备考知识点复习

    我太菜了qaq,我好爱咕咕咕啊 在NOIP2018爆炸后,我只能指望着在JSOI2019JSOI2020上咸鱼翻身(flag*1) 所以,我要开始复习学习(flag*2) 此博客文会不定时更新qaq( ...

  7. Struts2框架复习(一)--最基本的struts2框架

    前言 最近离职在家,发现之前学习的Struts2框架由于长时间不使用有点生疏,有鉴于此写下此文以备自己复习使用,同时也供大家批评指正. 准备工作 我觉得Struts2主要就是对Servlet的封装,还 ...

  8. NOIp知识点复习——最短路计数

    $Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...

  9. 【Hybird】274-Hybird App 应用开发中 5 个必备知识点复习

    前言 我们大前端团队内部 ?每周一练 的知识复习计划还在继续,本周主题是 <Hybird APP 混合应用专题> ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多. 之前分享的每周 ...

随机推荐

  1. Java学习之旅基础知识篇:数组及引用类型内存分配

    在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...

  2. SuperSocket入门(三)-Telnet多服务实例和服务实例交互配置详解

        在SuperSocket入门(二)中我们已经简单了解了通过配置App.config文件使用BootStrap启动SuperSocket服务.我们先来看一下上个案例中的基本配置文件示例: < ...

  3. easyui datagrid的json格式

    easyui datagrid的json格式: {"columns":[[{"field":"one","title": ...

  4. arcpy.mapping实战-专题图制图自动化

    arcpy.mapping实战-专题图制图自动化 by 李远祥 最初对arcpy.mapping感兴趣是因为一次大规模的专题地图调整的需要,由于某某单位利用ArcEngine编写的专题图出图系统,出现 ...

  5. PL/SQL基本概念

    首先明确PL/SQL主要作用作用: SQL语言适合管理关系型数据库但是它无法满足更复杂的数据处理,所以产生PLSQL.PLSQL用户创建存储过程.函数.触发器.包及用户自定义的函数. 特点: PLSQ ...

  6. eclipse设置统一编码

    1.Window-->Preferences-->General-->Workspace->Text file encoding->Other->UTF-8. 2. ...

  7. vue实现图书管理demo

    年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...

  8. jQuery validata插件实现(每周一插件系列)

    大家好,第一次写有点正规的博客,以前都是随手复制几下.为了打LOL,我写快点,代码我都复制在最下面了,并且写了大量的注释. 首先我写jquery插件,喜欢这么写(好处有很多,以后在讲,哈哈,看过jQu ...

  9. JS作用域理解

    1.JS解析步骤: a.预解析 将变量声明提升: 将函数声明及函数内容提升,可以理解成原来位置的函数在解析代码时已经提到代码初始位置: 遇到重名,只留下一个: 如有重名变量和函数,留下函数: 如有两个 ...

  10. API code

    /*--------------------------------------------------- BLOKOUT2.C -- Mouse Button & Capture Demo ...