struts2操作

//*****************************************/
目录 :
 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]第n个参数
   
 9.3.js不存在有没有参数的问题,想传几个就有几个   
  
  
  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值