Struts2之初体验
Struts2
1.了解Struts2 请求调度框架
Struts2是一个MVC框架
Struts2类库:
Struts2-core Struts2核心
XWork-core xwork核心 Struts2的构建基础
javassist-GA 底层对字节码文件进行处理
commons-fileupload 文件上传 commons-io java io 扩展
commons-lang 数据类型的工具类
freemarker 标签引擎使用类库
ognl 表达式语言类库 2.入门案例
使用Struts2开发程序的基本步骤
1.1.加载Struts2类库
<!--获取ServletAPI-->
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency> <dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.4.1</version>
</dependency> <dependency>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
<version>2.3.4.1</version>
</dependency>
1.2.配置web.xml文件
配置的是什么?
解析:过滤器 核心过滤器 StrutsPrepareAndExecuteFilter
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</display-name>
<!--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>
<!--拦截所有的Action(请求)-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app> 1.3.开发视图层页面
<s:form method="post" action="login">
请输入用户名: <s:textfield name="username"></s:textfield><br/>
请输入密码:<s:textfield name="password"></s:textfield><br/>
<s:submit value="登录"></s:submit>
</s:form>
1.4.自定义开发控制层Action类
import com.opensymphony.xwork2.Action; public class UserAction implements Action {
//Action接口的5个静态常量:SUCCESS NONE INPUT LOGIN ERROR
//和 SpringMVC controller 进行对比
public String execute() throws Exception {
return SUCCESS;
}
}
1.5.配置Struts2.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>
<!--包的继承。有点像java中的类的继承-->
<package name="default" namespace="/" extends="struts-default">
<action name="userAction" class="cn.happy.action.UserAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
1.6.部署 运行项目
将项目部署到服务器中,并运行项目(注:我用的是Tomcat)。 3.自动装配
Struts2 自动装配 AutoAware(PageUI----->控制器属性)
零散属性的自动装配:Action类中成员变量的名称和页面上表单元素name属性值保持一致。 领域模型的自动装配
配置一:
public class FirstAction implements Action{
private UserInfo userInfo;
}
userInfo.username;
userInfo.password; 配置二:ModelDriven
public class FirstAction implements Action,ModelDriven<UserInfo>{
private UserInfo userInfo=new UserInfo();
public UserInfo getModel(){
return userInfo;
}
} 4.ServletAPI 去获取常见对象Session,request
与Servlet API解耦的访问方式
方案一:对Servlet API进行封装,借助ActionContext
--->01.使用ActionContext类获取ServletAPI对象对应的Map对象
方式一:
public class FirstAction implements Action{
public String execute() throws Exception{
Map<String,Object> map=ActionContext.getContext().getSession();
map.put(k,v);
return "逻辑视图名";
}
}
方案二:向Action中注入ServletAPI对象对应的Map对象
--->02.Struts2向Action注入ServletAPI对象对应的Map对象
public class FirstAction implements Action,SessionAware{
private Map<String,Object> map;
public String execute() throws Exception{
map.put(k,v);
return "逻辑视图名";
}
public void setSession(Map<String,Object> map){
this.map=map;
}
} 与Servlet API耦合的访问方式
方式一:通过ActionContext的子类ServletActionContext实现
public class FirstAction implements Action{
public String execute() throws Exception{
HttpSession session=ServletActionContext.getRequest().getSession();
session.setAttribute(k,v);
return "逻辑视图名";
}
}
方式二:向Action实例注入Servlet API对象
public class FirstAction implements Action,ServletRequestAware{
private HttpServletRequest request;
public String execute() throws Exception{
HttpSession session=request.getSession();
session.setAttribute(k,v);
return "逻辑视图名";
} public void setServletRequest(HttpServletRequest httpServletRequest){
this.request=httpServletRequest;
}
} 5.Action------->UI 数据共享
Map<String,Object> map;
map.put("uname","张三");
方式一:不加#
// ValueStack vs=ActionContext.getContext().getValueStack();
ValueStack vs=(ValueStack)ServletActionContext.getRequest.getAttribute(struts.valueStack);
vs.push(map); <s:property value="uname"></property>
${uname} 方式二:得加#
<property value="#session.uname"></property> 解耦和耦合判定的依据,是否使用原生的ServletAPI类型。。
Struts2之初体验的更多相关文章
- Struts2之一 初体验
Struts2 框架是基于MV模式开发的,它提供了一个核心控制器,用于对所有的请求进行统一处理,这个控制器是由一个名为FilterDispatcher的Servlet过滤器来充当的. 01.需要在we ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
随机推荐
- 洛谷 P2376 [USACO09OCT]津贴Allowance
https://www.luogu.org/problemnew/show/P2376 看了题解做的,根本不会贪心.. #include<cstdio> #include<algor ...
- memcpy/memmove?快速乘?
memcpy?memmove? //#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; ; ],b[n ...
- Longest Palindromic Substring笔记
这是一道在leetcode上看到的题目 一开始,我能想到的思路是蛮力法: 就遍历每个字符,然后对每个字符都尝试从1到n的长度,看有没有回文串,并记录以该字符起始的回文串的最大长度.这个思路其实没有上手 ...
- 181. 将整数A转换为B
181. 将整数A转换为B 如果要将整数A转换为B,需要改变多少个bit位? 注意事项 Both n and m are 32-bit integers. 您在真实的面试中是否遇到过这个题? Yes ...
- public private protected 三种访问修饰符在c#中的区别
1. public 公有的可见性:在类自身内部可见: 可被子类继承: 类外部可见 2. protected 受保护的可见性:在类自身内部可见: 可被子类继承: 类外部不可见 3. private 私有 ...
- echarts 添加Loading 等待。
capturedsDetailsEcharts: function(id) { if (!id) { id = mini.get("chnNameCaptureds").getVa ...
- kafka-->storm-->mongodb
目的: 通过Spout发射kafka的数据,到bolt统计每一个单词的个数,将这些记录更新到mongodb中. Spout的nextTuple方法会一直处于一个while循环这中,每一条数据发送给bo ...
- iOS 多尺寸屏幕适配
Point Point可以理解为iOS程序员眼中的大小单位.它是iOS操作系统中的抽象的概念. Rendered Pixels可以理解为UI设计师眼中的大小单位. Physical Pixels 设备 ...
- VS 2013如何编译ASM文件
1. 左键点击解决方案下面的工程 2. 点击上面菜单中的项目,此时有个生成自定义属性 3. 勾选上masm,此时就有Microsoft Macro Assembler了 https://stac ...
- 在Ubuntu16.04安装YouCompleteMe
作为从事了4年多嵌入式Linux工作的软件工程师,最近决定完全在ubuntu上工作,使用vim进行代码的阅读和编辑,然后尝试去安装vim相关的各种插件.从来没用过代码补全的我,在网上找到了插件omni ...