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,然后就会增加被攻击的几率,

今天就讲到这里,如果有什么地方讲的不对,欢迎指出.

原创粉丝点击