struts2基础加强
来源:互联网 发布:萧涵seo 编辑:程序博客网 时间:2024/05/17 01:30
csdn会出现图片丢失的情况,简直了有木有,下次还是不上传图片了
上篇文章我们讲述了struts2的基本用法,本章我们来讲讲action的三种配置方法,如何请求转发,重定向,接收参数等
action三种配置方法
方法一
<!-- 方法一 --> <!-- 优点,阅读性强,缺点 代码臃肿,每个请求都需要配置一个action --> <package name="action" extends="struts-default" namespace="/"> <action name="action_fun_01" class="com.itcast.demo4.action1" method="fun01"/> <!-- 第二个方法,每个方法都需要配置--> <action name="action_fun_02" class="com.itcast.demo4.action1" method="fun01"/> </package>
方法二
<!--开发中最常用,代码量少,需要注意的是,方法名跟星号位置代码要一致,否则会报出反射异常,因为{1}的作用是读取第一个星号代替的值,所以我们一个package只需要配置一个action,大大减少了垃圾代码量--><package name="action2" extends="struts-default" namespace="/"> <action name="action_*" class="com.itcast.demo4.action2" method="{1}"/><!--如果采取通配符的方式,只需要配置一个Action就可以了, *用于表示匹配任意字符。 后面的{1} 就表示能够取到 * 所处位置的字符,然后找到对应的方法。--> </package>
方法三
<!--通过动态方法访问--><!--第三种方式可读性不强 ,这种方式使用动态代理访问。用的很少,并且容易被攻击--><!--该方法与前俩种不同,需要添加配置信息,1.打开动态访问开关,在Struts.xml文件配置--><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><!--配置action的名字--><action name="userAction" class="com.itheima.web.UserAction"></action><!--访问方式--><!--访问路径通过actionName + !+ action类中的方法名访问--><--http://localhost:8080/day02D_Struts2/userAction!login-->
知识点补充:Constant用来配置常量值的,目的是修改Struts的default.propertis中的默认值的
请求转发,重定向等相关操作
struts2 执行的方法是有返回值的,只要返回值有对应的结果集,就可以通过配置type进行重定向,转发等,
Result标签
概述 : 主要功能就是对方法返回结果进行处理,一般可以跳转到其他页面也可以跳转的action
属性解释:
name:视图名字,对应的是Action类中执行的方法的返回值。
type: 响应给浏览器的类型,默认类型是转发,
Action跳转页面
<!--默认是请求转发,也就是dispatcher,/是根目录,也就是WebContent目录下--> <result name="success" type="dispatcher">/index.jsp</result> <!--请求转发到action--> <result name="fun_01" type="chain">/index.jsp</result><!--虽然上面都是请求转发,但是还是有很大的区别,一个是只能跳转去jsp,等,一个是只能跳转去action--><!--重定向到jsp,html等页面--><result name="fun_02" type="redirect">/index.jsp</result><!--重定向到action等页面--><result name="fun_02" type="redirectAction">/index.jsp</result><!--虽然上面都是重定向,但是还是有很大的区别,一个是只能跳转去jsp,等,一个是只能跳转去action-->
其它的结果
一般来说,我们除了跳转到jsp,要不就是跳向action.但是除了这俩种结果外,我们有时还需要操控其它数据,比如使用ajax 返回json数据
响应JSON数据
进行配置之前,我们需要导入json相关的jar包,jar包在我们下载的lib文件夹里搜索一下就行了,然后导入jar包之后,Result结果集需要配置type, 值为json 还需要修改package的继承类,因为我们原先继承的package包里面没有json的type,所以我们需要继承json jar包package,下面让我们来看一下json的package包结构
<!--看json的继承关系可以发现,它继承了我们原先继承的package,所以我们不用担心功能丢失,--> <package name="json-default" extends="struts-default"> <result-types> <result-type name="json" class="org.apache.struts2.json.JSONResult"/> <result-type name="jsonActionRedirect" class="org.apache.struts2.json.JSONActionRedirectResult"/> </result-types> <interceptors> <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/> <interceptor name="jsonValidation" class="org.apache.struts2.json.JSONValidationInterceptor"/> <!-- Sample JSON validation stack --> <interceptor-stack name="jsonValidationWorkflowStack"> <interceptor-ref name="basicStack"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel</param> </interceptor-ref> <interceptor-ref name="jsonValidation"/> <interceptor-ref name="workflow"/> </interceptor-stack> </interceptors> </package>
看完源代码后,我们就可以写配置了
<package name="action3" extends="json-default" namespace="/"> <action name="action_*" class="com.itcast.demo4.action03" method="{1}"> <!-- name的action3类中方法中的返回值 --> <result name="success" type="json"> <!-- param 是我们action3类中需要转换成json的属性名 --> <param name="user"></param> </result> </action> </package>
然后在action3类中也要进行相关操作,通常我们会继承ActionSupport,需要一个转换json的对象 list , 然后还需要要一个get方法,
public class action03 extends ActionSupport{ private List<String> list = new ArrayList<String>(); public List<String> getList() { System.out.println("get 方法"); return list; } public String fun01(){ //添加数据 list.add("zs"); list.add("ls"); System.out.println(list); //需要注意的是 success 需要与配置文件result的name一致,否则会报没有result异常 return "success"; }}
最后服务器响应的数据如下
{"list":["zs","ls"]} /*已经成功的被转成json格式,注意事项,如果包没有继承json-default,那么会导致转换不成功,*/
获取参数,经常使用servlet的小伙伴一定很不习惯struts2,别问我为什么,没有了request,response .整个人都不好了,
那么问题来了,能不能手动获得request,response 呢? 答案是,当然可以
方案一 :
调用静态方法 : ServletActionContext.getRequest();
容我插一嘴,既然学习struts2 还是不要使用request,response比较好
方案二 ,
实现接口让Action使用实现特定的接口的方式访问Servlet的API,有如下接口可以实现
ServletContextAwareServletRequestAwareServletResponseAwareSessionAwareApplicationAware
获得请求参数
1.获得零散数据
可以使用我们上面的request对象来获取
//1.创建ActionContext对象ActionContext context = ActionContext.getContext();//2.获得所有的请求参数Map<String, Object> parameters = context.getParamters();
//1.获得request对象HttpServletRequest request = ServletActionContext.getRequest();requet.getParameter(String key);requet.getParameterValues(String key);requet.getParameterMap();
静态属性
我们来编写一个简单页面 <h1>01使用静态属性</h1><form method="post" action="${pageContext.request.contextPath }/action4_fun01"> 用户名:<input type="text" name="username"/><br/> <input type="submit"/></form>
编写action
public class action4 extends ActionSupport { //方式一 ,通过属性来获取 private String username; //提供set方法 public void setUsername(String username) { this.username = username; } public String fun01(){ System.out.println(username); return NONE; };}
配置struts.xml文件
<package name="action4" extends="struts-default" namespace="/"> <action name="action4_*" class="com.itcast.demo4.action4" method="{1}"/> </package>
由于时间关系,我就直接讲开发中常用的获取参数的方式
模型驱动获取参数
准备工作,创建一个javaBean
public class User { //提供属性 private String username; //set get方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //提供to String 方法 @Override public String toString() { return "User [username=" + username + "]"; }}
创建一个action5,继承ActionSupport 实现moderDriver实现类,
public class action5 extends ActionSupport implements ModelDriven<User>{ //提供需要封装的对象 private User user; //不用提供set get 方法 @Override public User getModel() { if(user == null){ user = new User(); } return user; } public String fun01(){ System.out.println(user); return NONE; };}
编写配置文件
<package name="action5" extends="struts-default" namespace="/"> <action name="action5_*" class="com.itcast.demo4.action5" method="{1}"> </action> </package>
进行测试
User [username=kkk] 输出结果 ,证明方法可行,
还有一种属性驱动封装的对象属性的方法,就不提了,这种方式开发中基本不会使用,因为会告诉用户我使用的是struts2,然后就会增加被攻击的几率,
今天就讲到这里,如果有什么地方讲的不对,欢迎指出.
- struts2基础加强
- 基础加强
- 基础加强
- 基础加强
- Struts2笔记加强版
- Java基础:基础加强
- Java基础:基础加强
- 基础加强(概述)
- java基础加强--反射
- java基础加强
- 基础加强第一天
- 基础加强第二天
- 基础加强第三天
- 基础加强第四天
- 基础加强第五天
- java基础加强
- 基础加强第六天
- 基础加强第七天
- 第1章、Linux是什么
- 宏定义(define)中'#'与'##'的用法
- ubuntu下配置teamviewer
- web前端基础小白练习效果,边框线条特效
- 编写程序,以菜单的形式完成算术运算和逻辑运算。制作小小计算器
- struts2基础加强
- Nginx安装及出现的错误
- js基础-未完待续
- CCPC.2017哈尔滨站-重现赛-M(随机:三点确定一个圆)
- hihocoder1426||UVALive
- constract制作的小游戏
- Android Studio Jni开发(三)Native方法动态注册
- pyhon 安装第一个模块 xlrd
- 欢迎使用CSDN-markdown编辑器