一.自定义的struts.xml(开发时频繁使用)

<?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><!--package:代表一个包,用于管理action ,一个包下不能有同名actionname:包名,在一个项目中不能有同名的包,一个项目中一个模块一个包或者小项目中前后台分别一个包extents:继承,类似于类的继承,如果一个包继承另一个包,那么会把父包的功能继承下来,(我们写的struts.xml中包必须继承默认包struts-default)namespace;名称空间,区分不同包的访问路径,默认为”/“用户访问action路径索索规则:若输入:http://localhost:8080/项目名称/user/a/b/c/login.action会先搜索:http://localhost:8080/项目名称/user/a/b/c/login.action若没有会继续搜索:http://localhost:8080/项目名称/user/a/b/login.action若没有会搜索:http://localhost:8080/项目名称/user/a/login.action知道找到匹配项abstract:用于表示当前包是否抽象,若为抽象则不能放入action子标签(若包中不做具体逻辑业务,如只是声明拦截器等那就可以设为抽象包)--><package name="xxx" extends="struts-default" namespace="/name" abstract="true"><!--配置action:http://localhost:8080/项目名称/login.action1.name:action的名称,用于访问此antion的路径class:action业务对象的类名(包名+类名),struts2使用反射构造Action对象method:执行的业务方法,默认为execute2.result标签的配置name:视图的标记,在一个action中名称不要重复type:跳转类型redirect:重定向dispatcher:转发redirectAction:重定向到actionchain:转发到action,可以在不同action中用request共享数据ServletActionContext.getRequest().setAttribute("","");放入stream:用于下载文件的时候文本内容:跳转的页面或者antion--><action name="login" class="com.study.action.LoginAction" ><result  name="success" type="redirect">/index.jsp</result></action></package>
</struts>

注意:structs.xml中的package各个模块可以分出来放入不同的.xml文件中,只需要在主struts.xml中加入<include file="包名/xxx.xml"></include>即可(注:若两个package中出现完全相同的action则先导入(include)的先执行)

二.web.xml中配置启动struts2核心过滤器

<filter><filter-name>StrutsPrepareAndExecuteFilter</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>StrutsPrepareAndExecuteFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

三.项目启动过程

1)创建核心过滤器对象
2)执行过滤器的init方法依次读取三个xml文件
struts-default:默认配置文件
struts-plugin:插件配置文件(如文件io等)
struts:自己写的业务配置
3)在内存中查询相应的action配置,得到class内容,创建action对象、
5)读取action中的method内容,执行action对象对应的方法

四.struts2中action使用的三种方式

1.直接写public class UserAction{} 不实现任何接口和继承任何类
缺点:没有规则和统一规范,里面的方法随意写
2.实现Action类public class LoginAction implements Action{}
优点:有默认方法execute+一些常用的视图标记

String SUCCESS = "success";String NONE = "none";String ERROR = "error";String INPUT = "input";input视图可以在页面打印错误信息例如:使用<%@ taglib prefix="s" uri="/struts-tags" %><s:fielderror></s:fielderror>就可以在页面打印错误信息String LOGIN = "login";

3.(推荐使用)继承ActionSupport类public class UserAction extends ActionSupport{}
优点:默认方法execute+提供了常用的视图标记+数据校验功能

五.action配置中的统配

<!--一个模块中的一个方法都需要一个action太浪费资源我们可以使用统配功能(首先约定名称一致):建议使用*:表示路径统配符。使用统配符的内容  {1}表示匹配第一个*的实际内容我们也可以使用动态方法调用(六中有动态方法调用的开启,默认开启)使用方法:用user.action访问时可以直接用user!方法名.action调用方法缺点:安全性问题,会暴露所有的方法:不建议使用--><action name="user_*" class="com.study.action.UserAction" method="{1}"><result name="{1}" type="dispatcher">/{1}.jsp</result></action><!--多模块使用一个action约定:第一个*代表模块第二个代表方法--><action name="*_*" class="com.study.action.{1}Action" method="{2}"><result name="{2}">/{1}/{2}.jsp</result></action>

六.常量配置

指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出 <constant name="struts.i18n.encoding" value="UTF-8"/>自定义后缀修改常量 <constant name="struts.action.extension" value="do"/>设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 <constant name="struts.serve.static.browserCache" value="false"/>当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 <constant name="struts.configuration.xml.reload" value="true"/>开发模式下使用,这样可以打印出更详细的错误信息 <constant name="struts.devMode" value="true" />默认的视图主题 <constant name="struts.ui.theme" value="simple" />与spring集成时,指定由spring负责action对象的创建 <constant name="struts.objectFactory" value="spring" />该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false<constant name="struts.enable.DynamicMethodInvocation" value="false"/>上传文件的大小限制 <constant name="struts.multipart.maxSize" value=“10701096"/>

例子1:
<!--修改default.properties的默认常量--> <!-- 修改action默认后缀名(规则:一个逗号(,)一个规则) 修改前访问login.action 修改后访问login.do --> <constant name="struts.action.extension" value="action,do,"></constant>

七.全局视图配置 和默认配置

1.全局配置

局部的会覆盖全局的配置

<global-results><result  name="success" type="redirect">/index.jsp</result>
</global-results>

2.默认配置

<!--默认配置:(全部默认的action,专门用于转发(不能用重定向)到web-inf下的页面)action中name:必须填class:可选 默认为ActionSupport 该类继承于struts-defaultmethod:默认executeresult中name:可选  默认为successtype:可选  默认为dispatcher--><action name="register"><result>/WEB-INF/login.jsp</result></action>

八.属性注入

模拟文件上传
UploadAction类:

package com.study.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import java.io.File;
/*** @author: Demon* @date: 2019/1/26* @time: 15:36* Description:模拟文件上传(属性注入)*/
public class UploadAction extends ActionSupport {private String path;public void setPath(String path) {this.path = path;}public String update() throws Exception {//获取文件File file = new File("e:/1.jpg");System.out.println(path);//文件上传至服务器FileUtils.copyFile(file, new File(path + "/img"));return SUCCESS;}
}

struts.xml文件配置:

<!--属性注入--><action name="ioc" class="com.study.action.UploadAction" method="update"><result name="success">/success.jsp</result><!--属性注入:paramname:UploadAction中setter方法名--><param name="path">e:/img/</param></action>

九.数据共享三种方法(struts2提供的域对象的使用)

第一种(若单纯存储数据不推荐,若用到域对象中除了共享数据外的其他方法就必须使用)

ServletActionContext对象:可以在struts2的action中使用域对象
特点:依赖servlet原生的api

HttpServletRequest request= ServletActionContext.getRequest();

第二种(Action对象方法比较少时可以用)

ActionContext对象(拦截器创建的方法):action的上下文对象,提供了操作不同域对象数据的map集合
特点:不依赖servlet原生的api,只能在某个方法中用

     ActionContext actionContext=ActionContext.getContext();//得到request域的map集合Map<String ,Object> requestMap=actionContext.getContextMap();requestMap.put("list",list);//得到sessionMap<String ,Object> sessionMap=actionContext.getSession();sessionMap.put("list",list);//得到context域Map<String ,Object> contextMap=actionContext.getApplication();contextMap.put("list",list);

第三种(推荐使用)

通过struts提供的接口(RequestAware,SessionAware,ApplicationAware )注入到Action中
特点:不依赖servlet原生的api,可以在Action类中的所有方法中共享

public class Test extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {private Map<String, Object> contextMap;private Map<String, Object> requestMap;private Map<String, Object> sessionMap;@Overridepublic void setApplication(Map<String, Object> map) {this.contextMap = map;}@Overridepublic void setRequest(Map<String, Object> map) {this.requestMap = map;}@Overridepublic void setSession(Map<String, Object> map) {this.requestMap = map;}//放数据public String test() {contextMap.put("list", list);requestMap.put("list", list);sessionMap.put("list", list);return null;}
}

十.请求数据封装

实现原理是依靠struts-default.xml中的拦截器(类似于过滤器,拦截器只对antion起作用)实现的,其中<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>实现请求参数的封装

第一种方式:直接赋值给简单的参数

代码示例
页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/data/user_get.action">
名字:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
性别:<input type="radio" name="sex" value="男"/>男<input type="radio" name="sex" value="女"/>女
爱好:<input type="checkbox" name="hobby" value="抽烟">抽烟<input type="checkbox" name="hobby" value="喝酒">喝酒<input type="checkbox" name="hobby" value="烫头">烫头<br/><input type="submit" value="提交"/>
</form>
</body>
</html>

接收类UserAction:

public class UserAction extends ActionSupport{private String userName;private String password;private String sex;private String[] hobby;public void setUserName(String userName) {this.userName = userName;}public void setPassword(String password) {this.password = password;}public void setSex(String sex) {this.sex = sex;}public void setHobby(String[] hobby) {this.hobby = hobby;}public String get(){System.out.println(userName);System.out.println(password);System.out.println(sex);System.out.println(hobby);return SUCCESS;}
}

第二种方式:直接赋值给javabean对象

注意:这里需要在表单jsp页面提交时name属性应该为对象名.属性的getter方法名
代码示例
页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/data/user_get.action">
名字:<input type="text" name="user.userName"/><br/>
密码:<input type="password" name="user.password"/><br/>
性别:<input type="radio" name="user.sex" value="男"/>男<input type="radio" name="user.sex" value="女"/>女
爱好:<input type="checkbox" name="user.hobby" value="抽烟">抽烟<input type="checkbox" name="user.hobby" value="喝酒">喝酒<input type="checkbox" name="user.hobby" value="烫头">烫头<br/><input type="submit" value="提交"/>
</form>
</body>
</html>

接收类UserAction:

package com.study.data;
import com.opensymphony.xwork2.ActionSupport;
import com.study.bean.User;
/*** @author: Demon* @date: 2019/1/26* @time: 17:13* Description:*/
public class UserAction extends ActionSupport{private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String get(){System.out.println(user);return SUCCESS;}

javabean:User类这里略

十一.自定义类型转换继承StrutsTypeConverter

自定义日期的类型转换

MyDateConverter:类

package com.study.converter;
import org.apache.struts2.util.StrutsTypeConverter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;/*** @author: Demon* @date: 2019/1/26* @time: 19:53* Description:自定义日期转换器*/
public class MyDateConverter extends StrutsTypeConverter{SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy/MM/dd");/***从页面到服务器的类型转换* map:值栈上下文对象* strings:从页面传递过来的参数值* aClass:转换到的类型 String-》java.util.Date*/@Overridepublic Object convertFromString(Map map, String[] strings, Class aClass) {try {//判断values是否为空if(strings==null||strings.length==0){return null;}Date[] dates=new Date[strings.length];//取出数据进行转换for(int i=0;i<dates.length;i++){Date date=simpleDateFormat.parse(strings[i]);dates[i]=date;}return dates;} catch (ParseException e) {e.printStackTrace();throw new RuntimeException(e);}}@Overridepublic String convertToString(Map map, Object o) {return null;}
}

与struts2绑定才能使用:
1)方式一:局部绑定(只能绑定一个)
建立一个Action的文件名-conversion.properties
一定和绑定的Action放在同一个目录下
例如:
UserAction-conversion.properties与UserAction在同一目录下
properties中写user.birth对应自己定义的转换器(如:MyDateConverter )的全名(包名+类名)
2)方式二:全局绑定(绑定整个项目的action)
建立一个xwork-conversion.properties(名称不能改)
放在src目录下
例如:
properties写java.util.Date对应自己定义的转换器(如:MyDateConverter )的全名(包名+类名)

抗遗忘最好的方法就是记下来
未完待续。。。。。。。

structs2框架学习一(启动过程和各种配置)相关推荐

  1. Delta3d框架学习--程序启动过程详解

    一个Delta3d程序启动过程详解 一.初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameA ...

  2. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  3. Spring框架学习笔记09:基于XML配置方式搭建SSM框架实现用户登录

    文章目录 一.采用MVC架构 二.用户登录运行效果 三.基于XML配置方式搭建SSM框架实现用户登录 (一)创建数据库与表 - simonshop (t_user) 1.创建数据库 - simonsh ...

  4. Spring框架学习笔记08:基于Java配置方式使用Spring MVC

    文章目录 一.基于Java配置与注解的方式使用Spring MVC 1.创建Maven项目 - SpringMVCDemo2020 2.在pom.xml文件里添加相关依赖 3.创建日志属性文件 - l ...

  5. 【网址收藏】dubbo特新概念及特性、环境搭建、dubbo-monitor安装、rpc原理以及dubbo原理:框架设计、启动解析加载配置信息、服务暴露、服务引用及调用

    https://blog.csdn.net/qq_41157588/article/details/106737191

  6. Spring框架学习笔记11:基于Java配置方式SSM框架西蒙购物网

    文章目录 一.网站功能需求 二.网站设计思路 1.设计模式 2.网站前台 3.网站后台 4.购物流程图 三.网站运行效果 四.网站实现步骤 (一)创建数据库与表 1.创建数据库 - simonshop ...

  7. Spring框架学习笔记10:基于XML配置方式SSM框架西蒙购物网

    文章目录 一.网站功能需求 二.网站设计思路 1.设计模式 2.网站前台 3.网站后台 4.购物流程图 三.网站运行效果 四.网站实现步骤 (一)创建数据库与表 1.创建数据库 - simonshop ...

  8. Spring框架学习笔记07:基于XML配置方式使用Spring MVC

    文章目录 一.Spring MVC概述 1.MVC架构 2.Spring MVC 3.使用Spring MVC的两种方式 二.基于XML配置与注解的方式使用Spring MVC (一)创建Spring ...

  9. 高通WLAN框架学习(2)- -建立和配置WLAN连接

    3.1  通过命令行建立WLAN连接 在屏幕未点亮的时候,可以执行如下命令来检查WLAN的连接情况,但是需要root的权限,否则无法执行如下的命令: //检查wlan.ko是否加载 lsmod//如果 ...

  10. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 主线程创建 Activity 实例之前使用插件 Activity 类替换占位的组件 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. JSP--JavaBean
  2. 王海峰发布百度智能云最新架构,推出AI中台和知识中台
  3. 颠覆性技术的兴起及其影响
  4. Windows server 2012 搭建×××图文教程(一)安装×××相关服务
  5. 基于光线追踪的Mental Ray鱼眼镜头的编程实现 作者:华文广
  6. C语言——vs2010的使用 || C语言入门知识
  7. table的td、th的一些样式问题(宽度,边框,滚动条)
  8. 纯前端表格控件SpreadJS V12.1 隆重登场,专注易用性,提升用户体验
  9. Spark Relational Cache实现亚秒级响应的交互式分析
  10. php无嵌套遍历多维数组,不递归怎么遍历多维数组(维数不定)
  11. java旋转图片后边上变黑_Java旋转图像将背景的一部分变成黑色
  12. 1042 mysql57_一次处理DB2宕机的实战经历(SQL1042C )
  13. Linux 建立文件夹的链接
  14. 转换大师swf转html,iPixSoft SWF to HTML5 Converter
  15. 计算机控制的液压提升,LSD液压提升系统(2008).doc
  16. 根据c语言标识符的命名规则 标识符只能由,二级C语言教程同步习题集答案解析1-2章.doc...
  17. ps制作印章教程:印章ps制作盖章
  18. python-tkinter使用方法——转载(二)
  19. AndroidStudio升级到3.1+之后,出现Java.util.NoSuchElementException
  20. 面向越野地形自动驾驶的语义地形分类

热门文章

  1. java控制台输出图片
  2. com.itextpdf.text.exceptions.IllegalPdfSyntaxException: Unbalanced begin/end text operators.
  3. Android SeekBar控件详解
  4. python3GUI——微博图片爬取工具
  5. ubuntu 刷新频率 如何查看_Ubuntu 7.04救命啊!屏幕刷新频率只有50HZ眼不行啦!显示器是CRT...
  6. h5 android 重力 晃动,H5案例分享:html5重力感应事件
  7. uC/OS II移植
  8. 详解电源反接使用MOS管保护电路原理及其优势
  9. 五分钟教你学会写产品需求文档(PRD)
  10. Markdown 全文检索