struts学习第一天

1、使用struts搭建项目
首先:在web.xml中进行配置过滤器,在src路径下创建struts.xml里面配置action。(注意,action的返回值:不像使用SpringMVC直接可以返回到WEB-INF下面的页面),返回页面需要在xml中根据返回的内容进行配置,返回页面放在WebContent下。

public class HelloAction extends ActionSupport {
    @Override
    public String execute() throws Exception {

        return "OK";
    }
}

理解下面的配置:struts.xml中的各个标签以及属性的意义及使用方式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="hellodemo" extends="struts-default" namespace="/">
        <action name="hello1" class="com.itcast.struts.HelloAction">
            <result name="OK">/hello.jsp</result>
        </action>
    </package>
</struts>

package:类似于包,区别于不同的action 他其中的属性name和功能本身没有关系,但是不同的package的name属性不能相同。extends属性默认是struts-default,表示在这个package包里面配置的类具有action的功能。namespace默认是/,他与action标签中的name属性值,构成访问路径。并且action标签中的name属性的不能相同。
action标签:class表示配置的类的类路径。method属性:不配置,默认执行类中的execute方法,如果需要指定其他的方法,需要进行配置method。method属性值写的是你要执行的方法的名称
两种配置方式:(1)直接写要执行的方法的名字,这样会配置很多的action
(2)、使用通配符的方式实现

<package name="hellodemo2" extends="struts-default" namespace="/">
//访问路径/hello_add,method的值就会变为add
//访问路径/hello_update,method的值就会变为update
        <action name="hello_*" class="com.itcast.struts.HelloAction" method="{1}">
            <result name="OK">/hello.jsp</result>
        </action>
</package>

result标签:name属性值和方法的返回值是相同的,type属性:配置如何找到路径,转发或者重定向。默认是转发。
如果有返回值,但是配置result有错误,可能会引起一个No result defined for Action的错误
如果有返回值,返回值的类型必须是String。
action方法中可以没有返回值,这时就不必再result中进行配置。
实现:返回的时候返回一个NONE常量。
可以让方法返回void,但是不建议这样用。

2、有关编码问题
在表单进行提交时,使用post方式,如果有中问,会自动解决编码问题,不需要我们解决。

3、分模块开发
单独写配置文件,然后把配置文件引入到核心配置文件中。

4、Action的编写,有三种方式
(1)继承ActionSupport类,然后重写execute方法,其实ActionSupport是实现了Action接口的
(2)实现Action接口
(3)直接写action,

5、全局页面配置和局面页面配置
全局页面配置,就是如果好几个action的返回值相同,跳转页面也同,可以写一个配置即可。下面的配置也要写在package标签中

<global-results>
        <result name="success">/hello.jsp</result>  
</global-results>

局部页面配置:如果某一个的返回值和其他的相同,但是跳转的页面不同,这个时候可以单独进行配置,而此时,如果即配置了全局又配置了局部,那么会优先使用局部配置。

<global-results>
            <result name="success">/hello.jsp</result>  
        </global-results>
        <action name="add" class="com.itcast.struts.HelloAction" method="add">
            <!-- 跳转到index.jsp -->
            <result name="success">/index.jsp</result>
        </action>
        <action name="update" class="com.itcast.struts.HelloAction" method="update">
            <!-- 跳转到hello.jsp -->
        </action>

6、result标签的type属性(总共有四个值):
跳转到页面有两个值:redirect(转发,默认) , dispatcher(重定向)

跳转到别的Action有两个值:chain:转发到Action,一般不用,因为缓存问题
redirectAction:重定向到Action,

7、Action获取表单提交数据(原始方式)
(1)、使用ActionContext类,这个类中的方法不是静态方法,所以需要创建ActionContext类,但是他不是new出来的。

ActionContext context = ActionContext.getContext();
Map<String,Object> map = context.getParameters();//得到表单中的数据

(2)、使用ServletActionContext类,获取到request对象,得到HttpServletRequest对象。

8、在Action中操作域对象。在Servlet中,有三大域对象(request,session,application即ServletContext)
在Action中进行操作时,通过方法即可得到域对象,

HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext servletContext =ServletActionContext.getServletContext();

还可以通过接口的方式去实现RequestAware,SessionAware,ApplicationAware接口。

public class TomAction extends ActionSupport implements RequestAware {

    private Map<String,Object> request;

    @Override
    public void setRequest(Map<String, Object> arg0) {
        this.request=arg0;

    }
    @Override
    public String execute() throws Exception {
        request.put("userName", "Sakura");
        System.out.println("Tom,hello");
        return "ok";
    }

}

9、Action获取表单提交数据
(1)、属性封装
实现:首先在Action成员变量位置定义成员变量,并且提供其get,set方法。属性名称和表单输入项的name名称相同,
使用属性封装,获取表单数据封装到属性中,但是不能把数据封装到实体类中

(2)、模型驱动封装
可以把数据直接封装到实体类中
实现:Action先实现接口 ModelDriven<T>接口,这个会指定要封装到的实体类的类型。实现接口类的getMethod方法,这里会把创建好的实体类返回,创建实体类对象。
这种方式要求实体类的属性和表单输入项的name值相同。

public class WorldAction extends ActionSupport implements ModelDriven {

    private User user = new User();
    @Override
    public Object getModel() {

        return user;
    }

}

使用属性封装和模型驱动封装的注意事项:
在一个Action中可以使用属性封装,也可以使用模型驱动封装,但是不能使用同时使用它们去获取同一个表单数据,如果同时使用,则会优先使用模型驱动封装。
(3)、表达式封装
把表单提交数据封装到实体类中
实现:先在Action中声明实体类,生成实体类的get,set方法,在表单输入项的name属性值中写表达式形式。

Action类
public class WorldAction extends ActionSupport{
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    public String execute(){
        System.out.println(user);
        return NONE;        
    }

}
表单页面
<form action="${pageContext.request.contextPath }/hello" method="post"> 
        姓名:<input type="text" name="user.username" /><br/>
        密码:<input type="text" name="user.password" /><br/>
        <input type="submit" value="提交" />
    </form>

表达式封装和模型驱动封装的异同:
同:都可以把数据封装到实体类中
异:使用模型驱动,在一个Action中只能把数据封装到一个实体类对象里面,因为在实线ActionDriven 接口的时候已经确定了泛型的类型。
使用表达式封装,可以把数据封装到不同的实体类对象中。

(4)、封装到list集合中和封装到map中,与表达式封装类似,只是页面部分有区别。

list<User>
        姓名:<input type="text" name="user[0].username" /><br/>
        密码:<input type="text" name="user[0].password" /><br/>

        姓名:<input type="text" name="user[1].username" /><br/>
        密码:<input type="text" name="user[1].password" /><br/>
map<String,User>   one ,abcd是指map中的键,可以为任意的值,也可以直接点(.)key的名字
        姓名:<input type="text" name="user['one'].username" /><br/>
        密码:<input type="text" name="user['one'].password" /><br/>

        姓名:<input type="text" name="user['abcd'].username" /><br/>
        密码:<input type="text" name="user['abcd'].password" /><br/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值