struts2操作
2013-12-08 22:48
309 查看
//*****************************************/
目录 :
1.导入jar包
2.配置前端控制器web.xml中
3.src 目录下的配置struts.xml
4.Action
5.实现分页显示
6.struts2核心组件
7.ValueStack,各个组件共享数据的容器
8.struts2:工作流程
9.ognl表达式
10.struts2:标签库
//*****************************************/
//*****************************************/
//*****************************************/
<!-- 配置Struct2提供的前端控制器(过滤器) -->
<filter>
<filter-name>Struct2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<!-- 访问该应用的所有请求都要被该过滤器所拦截 -->
<filter-mapping>
<filter-name>Struct2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//******************************************/
//*****************************************/
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="???" namespace="/???" extends="struts-default">
<action name="???" class="???">
<result name="success">WEB-INF/???.jsp</result>
<result name="fail">WEB-INF/???.jsp</result>
</action>
<action name="???" class="???">
<result name="success" type="dispatcher">WEB-INF/???.jsp</result>
<result name="fail">error.jsp</result>
</action>
</package>
</struts>
//******************************************/
//******************************************/
public class xxxAction{
//输入属性
//输出属性
//get();方法
//set();方法
public String execute(){
//调用model,根据输入算输出
return "success";
//或者
return "fail";
}
}
//******************************************/
//******************************************/
在DAO中写两个方法
第一个方法,根据当前第几页和每页要显示的记录数查找本页所有的记录
public List<> findAll(int page, int rowsPerPage) throws DAOException;
第二个方法,根据每页要显示的记录数获得总页数
public int getTotalPages(int rowsPerPage) throws DAOException;
在页面上每点击另外的页面链接,就访问一次服务器,
把请求的页面页数传上去,计算数据,结果传回来
//******************************************/
// ******************************************/
1).FC- FrontController,前端控制器,接收所有请求,根据请求调用相应的action
2).Action,输入属性,输出属性,根据输入算输出
3).Result,把输出数据用适当的格式输出给用户(数据格式:页面,json,等等),可扩展
4).Interceptor,拦截器,调用action(之前或之后)做些事情,可扩展
5).ValueStack,各个组件共享数据的容器,
6).Tags,struts2特有的标签库
//******************************************/
//******************************************/
ValueStack,各个组件共享数据的容器
分析:
有个栈stack,数据放在这里面,
外界给一个字符串,通过(ognl解析这个字符串的结果)去找数据,
先依次把栈里的每一个元素当作root对象,没有,找下一个,有就返回,root
有个map,(键值对)ognl表达式也可以从map里面取数据,
通过key找value,找的时候key值(ognl表达式)前加#号,
Context(存放主要是字典文件通用的数据)
有个ognl引擎,和栈连着
//******************************************/
//******************************************/
请求发给前端控制器
收到请求之后前端控制器实例化一个ValueStack
根据请求不同,实例化对应action,放到ValueStack栈顶
调用拦截器,用ognl表达式方式可以修改ValueStack中的action对象的属性
调用action根据输入算输出
调用result,显示数据
转到页面,页面的标签库也是通过ValueStack取数据
//******************************************/
//******************************************/
Ognl.getValue("ognl表达式",root对象);
ognl表达式,可计算,可调用方法,可投影
例子:
-----第一级
Ognl.getValue("intId",root对象);//数字
Ognl.getValue("strString",root对象);//字符串
Ognl.getValue("arrArray[1]",root对象);//数组的第二个值
Ognl.getValue("list[0]",root对象);//集合的第一个值
Ognl.getValue("map['three']",root对象);//HashMap的key为three项对应的值
Ognl.getValue("bar.name",root对象);//对象,获得此对象的name值
-----第二级:可计算
Ognl.getValue("emps[0].name+ emps[0].salary",root对象);//+号//字符相连接//如果是数字相加
Ognl.getValue("emps[0].salary > emps[1].salary",oroot对象);//比较运算返回boolean值
-----第三级:可调方法,(也可调静态方法)
Ognl.getValue("emps[0].name.length()",root对象);//可以调用方法
Ognl.getValue("emps[0].name.charAt(emps[0].name.length()-1)",root对象);//嵌套ognl表达式
Ognl.getValue("@Math@floor(emps[0].salary)",root对象);//可以调用静态方法用@
-----第四级:可投影
Ognl.getValue("emps.{salary}",root对象);//集合里面每一个对象的salary
// ******************************************/
// ******************************************/
10.1.导入标签
<%@taglib uri="/struts-tags" prefix="s"%>
10.2.调式的功能,可以在页面查看valueStack的全貌
<s:debug/>
10.3.从当前的valueStack取数据显示出来
<s:property value="ognl表达式"/>
例子:<s:property value="errorMsg"/>
//******************************************/
1.1.真正的实现类是StreamResult
1.2.功能:
可以用于输出二进制的数据
1.3.需要注入的参数:
inputName 的值:是ognl表达式,通过该表达式可以在vs中获取一个输入流对象
StreamResult就是从这个输入流中读取要输出的数据
1.4.例子:
struts.xml的配置
<action name="verificode"
class="com.tarena.netctoss.action.VerifiCodeAction">
<result type="stream">
<param name="inputName">imgCodeStream</param>
<param name="contentType">image/jpg</param>
</result>
</action>
备注:
param name="inputName":属性注入inputName
imgCodeStream 是Action中的输入流属性
设置了contentType告诉浏览器发送的是图片格式,浏览器就能显示了,而不是下载
因为浏览器不识别的东西会自己下载
// 图片的内存映像//RGB配色
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
// 获得画笔对象
Graphics g = image.getGraphics();
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setColor(new Color(0, 0, 0));
// 用于存储随机生成的验证码
StringBuffer number = new StringBuffer();
// 绘制验证码
for (int i = 0; i < NUM; i++) {
g.setColor(new Color(r.nextInt(128), r.nextInt(128), r.nextInt(128)));
int h = (int) ((HEIGHT * 20 / 100) * r.nextDouble() + (HEIGHT * 80 / 100));
g.setFont(new Font(null, Font.BOLD | Font.ITALIC, h));
String ch = String.valueOf(seq[r.nextInt(seq.length)]);
number.append(ch);
g.drawString(ch, i * WIDTH / NUM * 90 / 100, h);
}
//绘制干扰线
for (int i = 0; i <= 12; i++) {
g.setColor(new Color(r.nextInt(128), r.nextInt(128), r.nextInt(128)));
g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r
.nextInt(HEIGHT));
}
//将数据输出到内存中的一个二进制的字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//在内存中以位图的形式存放(二进制),占用空间大,用jpg压缩
//JPEGCodec和输出流相连
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
encoder.encode(image);
//通过内存输入流,把数据输入程序,返回一个输入流
InputStream is= new ByteArrayInputStream(baos.toByteArray());//返回二进制字节
4.1.
Action中
获取验证码的输入流对象
赋值给action的输入流属性(action输出属性)
4.2.
用result的stream类型
获取action的输入流属性
注入StreamResult的属性inputName
5.1.action中
获取一个文件的输入流
赋值给action的输出属性(是个输入流)
5.2.
用result的stream类型
获取action的输入流属性
注入StreamResult的属性inputName
第一种方法:不是很好
ActionContext xtx=ActionContext.getContext();//先获取Action上下文对象
ctx.getSession();//获取session
第二中方法:
1).需要用session的类实现 implements SessionAware 接口
2).定义一个session变量
private Map<String,Object> session;
3).实现接口的setSession方法,给session变量赋值
public void setSession(Map<String,Object> session){
this.session=session;
}
4).struts2将Session对象在HttpSession的基础上封装成了Map对象。
7.1.封装获取session的代码
BaseAction对获取session进行了封装,其他用session的action继承这个类
public class BaseAction implements SessionAware, Constants {
protected Map<String, Object> session;
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
例子:
子类:直接用session.put("","");
7.2.Constants常量接口
也被BaseAction实现,其他类继承BaseAction,就可直接使用封装的常量
例如:可以将session的key作为一个常量封装在Constants中
8.1.
可以不写action,直接在配置文件中配置,例如请求注册的action,没有输入输出
class默认为ActionSupport,execute默认return "success";
8.2.
result可以简写<result></result>
result 默认为success
9.1.jQuery扩展一个函数,例如:名字是 required,
$.fn.required=function(){
alert(this.val());
}
9.2.自定义扩展函数可以加一些参数增加可通用性
function(a,b,c){}; //a,b,c只是参数的别名
arguments[0]第0个参数
arguments
第n个参数
9.3.js不存在有没有参数的问题,想传几个就有几个
目录 :
1.导入jar包
2.配置前端控制器web.xml中
3.src 目录下的配置struts.xml
4.Action
5.实现分页显示
6.struts2核心组件
7.ValueStack,各个组件共享数据的容器
8.struts2:工作流程
9.ognl表达式
10.struts2:标签库
//*****************************************/
1.导入jar包
//*****************************************/
2.配置前端控制器web.xml中
//*****************************************/
<!-- 配置Struct2提供的前端控制器(过滤器) -->
<filter>
<filter-name>Struct2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<!-- 访问该应用的所有请求都要被该过滤器所拦截 -->
<filter-mapping>
<filter-name>Struct2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//******************************************/
3.src 目录下的配置struts.xml
//*****************************************/
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="???" namespace="/???" extends="struts-default">
<action name="???" class="???">
<result name="success">WEB-INF/???.jsp</result>
<result name="fail">WEB-INF/???.jsp</result>
</action>
<action name="???" class="???">
<result name="success" type="dispatcher">WEB-INF/???.jsp</result>
<result name="fail">error.jsp</result>
</action>
</package>
</struts>
//******************************************/
4.Action
//******************************************/
public class xxxAction{
//输入属性
//输出属性
//get();方法
//set();方法
public String execute(){
//调用model,根据输入算输出
return "success";
//或者
return "fail";
}
}
//******************************************/
5.实现分页显示
//******************************************/
在DAO中写两个方法
第一个方法,根据当前第几页和每页要显示的记录数查找本页所有的记录
public List<> findAll(int page, int rowsPerPage) throws DAOException;
第二个方法,根据每页要显示的记录数获得总页数
public int getTotalPages(int rowsPerPage) throws DAOException;
在页面上每点击另外的页面链接,就访问一次服务器,
把请求的页面页数传上去,计算数据,结果传回来
//******************************************/
6.struts2核心组件
// ******************************************/
1).FC- FrontController,前端控制器,接收所有请求,根据请求调用相应的action
2).Action,输入属性,输出属性,根据输入算输出
3).Result,把输出数据用适当的格式输出给用户(数据格式:页面,json,等等),可扩展
4).Interceptor,拦截器,调用action(之前或之后)做些事情,可扩展
5).ValueStack,各个组件共享数据的容器,
6).Tags,struts2特有的标签库
//******************************************/
7.ValueStack,各个组件共享数据的容器
//******************************************/
ValueStack,各个组件共享数据的容器
分析:
有个栈stack,数据放在这里面,
外界给一个字符串,通过(ognl解析这个字符串的结果)去找数据,
先依次把栈里的每一个元素当作root对象,没有,找下一个,有就返回,root
有个map,(键值对)ognl表达式也可以从map里面取数据,
通过key找value,找的时候key值(ognl表达式)前加#号,
Context(存放主要是字典文件通用的数据)
有个ognl引擎,和栈连着
//******************************************/
8.struts2:工作流程
//******************************************/
请求发给前端控制器
收到请求之后前端控制器实例化一个ValueStack
根据请求不同,实例化对应action,放到ValueStack栈顶
调用拦截器,用ognl表达式方式可以修改ValueStack中的action对象的属性
调用action根据输入算输出
调用result,显示数据
转到页面,页面的标签库也是通过ValueStack取数据
//******************************************/
9.ognl表达式
//******************************************/
Ognl.getValue("ognl表达式",root对象);
ognl表达式,可计算,可调用方法,可投影
例子:
-----第一级
Ognl.getValue("intId",root对象);//数字
Ognl.getValue("strString",root对象);//字符串
Ognl.getValue("arrArray[1]",root对象);//数组的第二个值
Ognl.getValue("list[0]",root对象);//集合的第一个值
Ognl.getValue("map['three']",root对象);//HashMap的key为three项对应的值
Ognl.getValue("bar.name",root对象);//对象,获得此对象的name值
-----第二级:可计算
Ognl.getValue("emps[0].name+ emps[0].salary",root对象);//+号//字符相连接//如果是数字相加
Ognl.getValue("emps[0].salary > emps[1].salary",oroot对象);//比较运算返回boolean值
-----第三级:可调方法,(也可调静态方法)
Ognl.getValue("emps[0].name.length()",root对象);//可以调用方法
Ognl.getValue("emps[0].name.charAt(emps[0].name.length()-1)",root对象);//嵌套ognl表达式
Ognl.getValue("@Math@floor(emps[0].salary)",root对象);//可以调用静态方法用@
-----第四级:可投影
Ognl.getValue("emps.{salary}",root对象);//集合里面每一个对象的salary
// ******************************************/
10.struts2:标签库
// ******************************************/
10.1.导入标签
<%@taglib uri="/struts-tags" prefix="s"%>
10.2.调式的功能,可以在页面查看valueStack的全貌
<s:debug/>
10.3.从当前的valueStack取数据显示出来
<s:property value="ognl表达式"/>
例子:<s:property value="errorMsg"/>
//******************************************/
1.result的stream类型
1.1.真正的实现类是StreamResult
1.2.功能:
可以用于输出二进制的数据
1.3.需要注入的参数:
inputName 的值:是ognl表达式,通过该表达式可以在vs中获取一个输入流对象
StreamResult就是从这个输入流中读取要输出的数据
1.4.例子:
struts.xml的配置
<action name="verificode"
class="com.tarena.netctoss.action.VerifiCodeAction">
<result type="stream">
<param name="inputName">imgCodeStream</param>
<param name="contentType">image/jpg</param>
</result>
</action>
备注:
param name="inputName":属性注入inputName
imgCodeStream 是Action中的输入流属性
设置了contentType告诉浏览器发送的是图片格式,浏览器就能显示了,而不是下载
因为浏览器不识别的东西会自己下载
2.画图
// 图片的内存映像//RGB配色
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
// 获得画笔对象
Graphics g = image.getGraphics();
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setColor(new Color(0, 0, 0));
// 用于存储随机生成的验证码
StringBuffer number = new StringBuffer();
// 绘制验证码
for (int i = 0; i < NUM; i++) {
g.setColor(new Color(r.nextInt(128), r.nextInt(128), r.nextInt(128)));
int h = (int) ((HEIGHT * 20 / 100) * r.nextDouble() + (HEIGHT * 80 / 100));
g.setFont(new Font(null, Font.BOLD | Font.ITALIC, h));
String ch = String.valueOf(seq[r.nextInt(seq.length)]);
number.append(ch);
g.drawString(ch, i * WIDTH / NUM * 90 / 100, h);
}
//绘制干扰线
for (int i = 0; i <= 12; i++) {
g.setColor(new Color(r.nextInt(128), r.nextInt(128), r.nextInt(128)));
g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH), r
.nextInt(HEIGHT));
}
3.输出
//内存流,连接的是内存中的一块区域//将数据输出到内存中的一个二进制的字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//在内存中以位图的形式存放(二进制),占用空间大,用jpg压缩
//JPEGCodec和输出流相连
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
encoder.encode(image);
//通过内存输入流,把数据输入程序,返回一个输入流
InputStream is= new ByteArrayInputStream(baos.toByteArray());//返回二进制字节
4.struts2验证码
4.1.
Action中
获取验证码的输入流对象
赋值给action的输入流属性(action输出属性)
4.2.
用result的stream类型
获取action的输入流属性
注入StreamResult的属性inputName
5.struts2下载
5.1.action中
获取一个文件的输入流
赋值给action的输出属性(是个输入流)
5.2.
用result的stream类型
获取action的输入流属性
注入StreamResult的属性inputName
6.strurs2获取session
第一种方法:不是很好
ActionContext xtx=ActionContext.getContext();//先获取Action上下文对象
ctx.getSession();//获取session
第二中方法:
1).需要用session的类实现 implements SessionAware 接口
2).定义一个session变量
private Map<String,Object> session;
3).实现接口的setSession方法,给session变量赋值
public void setSession(Map<String,Object> session){
this.session=session;
}
4).struts2将Session对象在HttpSession的基础上封装成了Map对象。
7.BaseAction
7.1.封装获取session的代码
BaseAction对获取session进行了封装,其他用session的action继承这个类
public class BaseAction implements SessionAware, Constants {
protected Map<String, Object> session;
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
例子:
子类:直接用session.put("","");
7.2.Constants常量接口
也被BaseAction实现,其他类继承BaseAction,就可直接使用封装的常量
例如:可以将session的key作为一个常量封装在Constants中
8.简写
8.1.
可以不写action,直接在配置文件中配置,例如请求注册的action,没有输入输出
class默认为ActionSupport,execute默认return "success";
8.2.
result可以简写<result></result>
result 默认为success
9.jQuery扩展封装
9.1.jQuery扩展一个函数,例如:名字是 required,
$.fn.required=function(){
alert(this.val());
}
9.2.自定义扩展函数可以加一些参数增加可通用性
function(a,b,c){}; //a,b,c只是参数的别名
arguments[0]第0个参数
arguments
第n个参数
9.3.js不存在有没有参数的问题,想传几个就有几个
相关文章推荐
- struts2+easyui datagrid可编辑操作及列表数据提交
- jqGrid与Struts2的结合应用(二) —— 操作Grid数据
- 防止未登录用户操作—struts2拦截器简单实现
- jqGrid与Struts2的结合应用(二) —— 操作Grid数据
- Struts2-jquery-操作ajax返回json数据
- struts2的图片流操作
- struts2 和ajax整合使用案例(原生态的ajax操作 和 struts2和ajax整合操作)
- 防止未登录用户操作—struts2拦截器简单实现
- struts2-json-jquery ajax 操作
- 防止未登录用户操作—struts2拦截器
- Struts2的Action中如何操作作用域对象
- 使用Struts2和jQuery EasyUI实现简单CRUD系统(六)——复选框进行多选删除操作
- struts2中后台代码操作cookie
- jqGrid与Struts2的结合应用(二) ------ 操作Grid数据 .
- Struts2标签——关于List<Object[]>的操作
- struts2.1笔记06:struts2开发环境的搭建实际操作出现的问题
- struts2的国际化(i18n)操作
- struts2操作数据库
- struts2 iterator status 属性 操作
- Struts2操作request、session和application对象