环境:eclipse+struts2.x
目录
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