您的位置:首页 > 编程语言 > Java开发

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:标签库

 

//*****************************************/

 

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不存在有没有参数的问题,想传几个就有几个   

  

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: