struts2.x学习笔记

环境:eclipse+struts2.x

目录

环境:eclipse+struts2.x

struts2.x 特点

1、环境搭建

2、action类的编写:

3、action 的配置:

三种获取数据的方式:

如何解决action太多的问题??

    标签:

        图片上传功能的实现:


struts2.x 学习笔记


struts2.x 特点


1、无侵入式设计:

不依赖与struts api 和servlet api
   无formbean,有另一种由表单注入数据的方式
struts1 -》servlet实现
struts2 -》filter实现


1、环境搭建


  下载struts2. 的包,解压其中一个工程(blank)
   a\将lib目录下jar包拷贝到自己工程的lib下
   b\拷贝web.xml到WEB-INF下
   c\拷贝struts.xml到src目录下


2、action类的编写:


   不需要继承action
   添加方法public String execute()方法,名字不一定
   如何获取response或者request对象?利用servletActionContext.getResponse


3、action 的配置:


先配置package,用来管理一个模块的action

<package name="user" namespace="/" extends="struts-default">
     <action name="checklogin" class="myuser.CheckLoginAction"  method="execute"> </action>
     <action name="checkexists" class="myuser.CheckExistsAction" method="execute"></action>
</package>

    注意:访问action时可以用 actionname.action(后面的.action可以省略)
 
 其中的namespace="/a" 如果访问其下的main.jsp 需要通过  /a/main.jsp  访问
 <s:if test="#session.user==null">
未登录
</s:if>

三种获取数据的方式:

假设

Javabean是   ClassName{
attributename1;
attributename2;
}

1.注入属性//前台传userName,password,

然后在action中添加同名属性,(当前action需要的数据,有可能只需要attributename1,那么前台就只传递attributename1的值来实现注入),并且添加setter方法,已实现属性注入,
       前台传递数据是以{attributename1:value1,attributename2:value2}传递数据

2.Domain Model 这是一般常用的方式(工作中常用)
      前台传数据时{"user.userName":Value1, "user.password":Value2}
      如果是通过表单提交的时候,需要注意表单中需要注入的数据的name  也需要是 name="object.attributename"的形式
     

3.ModelDriven(感觉不错,比较麻烦)
  步骤
 (1)action实现ModelDriven<User>接口
  (2) 添加抽象方法
 (3)定义并初始化一个模型(bean)
   User user=new User();
 (4)生成setter和getter

 public User getModel()
 {
    return user;
 }

 4、如何将同一模块的action合到同一个action中?
          1.新建CLASS UserAction  extends ActionSupport或者实现接口
          2、为userAction 添加属性user,并且设置setter和getter(利用DominModel的方式,所以前台数据需要写成object.attribute)的形式,用来注入,该object在此处时user)
          3.为每个action 添加  public String actionName(){};方法,将原action中的代码粘贴过来
          4.

如何解决action太多的问题??

    1.建立多个Action类
    2.method方式:

   建立一个Action类,在类中编写不同的方法,在不同的方法中处理不同的请求。
    在struts.xml中配置method属性,让不同的action指向同一个Action类的不同方法。
    

<action name="checklogin" class="myuser.UserAction"  method="checkLogin"> </action>
     <action name="checkexists" class="myuser.UserAction" method="checkExists"></action>
     <action name="adduser" class="myuser.UserAction" method="add">


    3.感叹号方式:
    先配置以下常量:
      

  <constant name="struts.enable.DynamicMethodInvocation" value="true" />


        DynamicMethodInvocation =动态方法调用
        不需要配置method,直接用"actionName!actionMethodName"的方式来调用。
         例如:struts.xml配置:
         <action name="user" class="myuser.UserAction"></action>
     调用时  user!add   即相当于:    <action name="adduser" class="myuser.UserAction" method="add">     
            

4.通配符方式(官网推荐) “约定大于配置”
 
   checkLogin    //这些全是UserAction中的方法名
   checkExists   
   add           
   delete        
   modify        

 <action name="*" class="myuser.UserAction" method={1}>
  <result name="success">/WEB-INF/user/userlist.jsp</result><!-- 相当于struts1的forward -->
 </action>


 
注意: 将userlist.jsp放到wen-inf下之后,只能从容器内跳转访问
如果要容器外跳转应该这样配置

<result name="success" type="redirect">/WEB-INF/user/userlist.jsp</result>
<!--但是这里容器外跳转也跳不进去,WEB-INF下的文件是受保护的-->


      

    ActionContext :ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters, locale等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext。  


    标签:

值栈:Value Stack
                Stack Context
                These items are available using the #key notation 
a.Value Stack 的概念  访问时不用加#

值栈

b.Stack Context      访问时要加#

都是用来存放数据,struts2的debug标签可以看到这两个栈中的对象
                  当action中的成员变量有setter和getter时,debug标签值栈中可以看到该成员

ognl表达式:比el表达式功能丰富
            1,支持方法调用
            2,赋值
            3,操作集合

struts2标签

绝对路径获取:
      el表达式:${pageContext.request.contextPath}  获得当前webcontent路径
      Java代码:request.getContextPath()
      ognl表达式:<s:property value="#request.get('javax.servlet.forward.context_path')" />'


注意:

struts2 中:  
          action 类中定义的的对象会存到值栈中,可以在return到的那个页面获取
       

  public String modify() throws SQLException
    {
        //UserDao dao=new UserDao();
        user=dao.getUserById(user.getId());//action 类中定义的的对象会存到值栈中,可以在return到的那个页面获取
        
        return "modify";//跳转到modify页面,
            //注意:      return的页面必须是在action标签下的result标签配置
    }


    
    
图片上传功能的实现:


1,创建数据表(存图片信息,没有存图片文件)
    pictures        id  
            uid(与users得联系)
            name
            url
2,picturedao   add,   图片信息存到数据库,文件存到服务器,磁盘
                getPic
3,编写PictureService   用来将服务器上得图片二进制转换为json字符串
3,PictureAction      add:
 编写获取图片的方法:getPic(图片是以二进制文件存在磁盘上的)

xml分离:
    struts.xml 里配置常量和公共的results  

  

  <struts>
     
    <constant name="struts.devMode" value="true"></constant>
    <package name="all" namespace="" extends="struts-default" >
    <global-results><!-- 大家都能用的转向 -->
        <result name="list" type="redirectAction">
            <param name="namespace" >/user</param><!-- 指定跳转到的包 -->
            <param name="actionName">list</param> 
        </result> 
    </global-results>
    </package>
    <!--  将其他xml通过include 命令引入-->
    <include file="user.xml"></include>
    <include file="picture.xml"></include>
    </struts>

    user.xml  配置用户模块的特有的results

  

  <struts>
      <package name="user" namespace="/user" extends="all">
        <action name="*" class="myuser.UserAction"  method="{1}"><!-- 通  配符版 -->
        <result name="success">/WEB-INF/user/userlist.jsp</result>   <!-- 相当于forward -->
        </action>
        </package>
    </struts>


      


layer:

json:{object}   [array]
 ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'image' on 'class mypic.PictureAction: Error setting expression 'image' with value ['C:\Users\Administrator\Pictures\P70820-154602.jpg', ]
01:17:55.636 [http-nio-8080-exec-3] ERROR org.apache.struts2.dispatcher.Dispatcher - Could not find action or result
/strutsPro2/pic/addPic?image=C%3A%5CUsers%5CAdministrator%5CPictures%5CP70820-154602.jpg&picture.name=111&picture.uid=1

在list页面,点击 照片:layer.use is not a function

     

猜你喜欢

转载自blog.csdn.net/qq_36922927/article/details/81278259
今日推荐