一.前言
第一篇介绍了struts的原理,这里写一下如何利用struts框架进行系统的开发,引用下面一个简单的系统来讲讲如何实现系统的一些功能.
二.准备工作
struts框架的jar包可以去官网下载struts官网
下载完毕,里面有我们需要的包,对于新手来说可以直接将下载好的文件,里面 有apps文件夹,里面有例子,解压后将里面lib里的包给导入到自己新建的工程里.同时可以参考下它里面的代码,可以更好的对struts的了解
三.struts文件配置
struts.xml文件配置 这个是关键所在,附上代码
<struts>
<!-- Overwrite Convention -->
<package name="default" namespace="/" extends="struts-default">
<action name="*_*" class="com.eduask.chp.action.{1}" method="{2}">
<result name="list">list.jsp</result>
<allowed-methods>Action的方法名</allowed-methods>
</action>
</package>
</struts>
注意:如果使用通配符的话,注意版本,我用的是最新的2.5的版本 .一定要加这句话,不然在开发工程的时候会报错
来分析下这个配置
1.<package name="default" namespace="/" extends="struts-default">
name的作用是用来区分不同模块的
namespace="/":这个是地址分割符,
extends="struts-default":实际上是把package中name为"struts-default"的包中的所有的功能,你也可以继承某个包,写上对应的包名
extends="struts-default":实际上是把package中name为"struts-default"的包中的所有的功能,你也可以继承某个包,写上对应的包名
2.<action name="*_*" class="com.eduask.chp.action.{1}" method="{2}">
这里的我用的是注解的模式,这样更快捷,你也可以直接写类名,和方法名.用{1}代表前一个的类名,{2}
3.<result name="list">list.jsp</result>
这里的是action层返回的结果的名字,后面是结果的jsp,中间可以设置type,默认为请求转发,你也可以加上type="redirect"表示重定向
三.控制层代码
action层也就是所说的控制层,基于mvc的结构,控制层的作用简单来说获取参数和传递结果,
(1)那如何获取参数呢?
新建一个用户的类
package com.eduask.chp.bean;
//用户类
public class User {
private int id;
private String userName;
private String passWord;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
再新建一个控制层
public class MyAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}//拦截器Params通过该方法,把网页穿过来的参数给action类里的属性赋值
public String list() throws Exception {
System.out.println("list===>"+user.getId()+"==>"+user.getUserName()+"==>"+user.getPassWord());
如果能在控制台输出该参数,代表获取成功
return "list";
}
为了简化操作,就不建立表单了,原谅我懒,直接在地址栏输入参数
http://localhost:8080/struts/MyAction_list?user.id=1&user.userName=abc&user.passWord=abc
重启服务器控制台输出,说明获取成功
但是这里地址栏输入的是对象.id,而我们在开发中没有这种习惯传递参数,但是如果不写 对象.会出现空指针错误.所以还有一种获取的方法
public class MyAction extends ActionSupport implements ModelDriven<User>{
private User user =new User();
public String list() throws Exception {
System.out.println("list===>"+user.getId()+"==>"+user.getUserName()+"==>"+user.getPassWord());
return "list";
}
@Override
public User getModel() {
return user;
}
}
http://localhost:8080/struts/MyAction_list?id=1&userName=abc&passWord=abc
重启服务器控制台输出,说明获取成功
(2)传递结果
在开发中如何将查询出来的结果返回给jsp呢?
接下来我就讲一种常用的,代码如下
public class MyAction {
private Map<String, Object> requestMap=(Map<String, Object>) ActionContext.getContext().get("request");
private Map<String ,Object> sessionMap=ActionContext.getContext().getSession();
private Map<String,Object> applicationMap=ActionContext.getContext().getApplication();
public String list() throws Exception {
requestMap.put("r", "requestMap的内容");
sessionMap.put("s","sessionMap的内容");
applicationMap.put("a", "applicationMap的内容");
return "list";
}
}
结果为
这三种存储的方式的区别是:
application:全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。
session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。
request:请求作用域,就是客户端的一次请求。
补充:也可以实现以下三个接口来实现赋值
public class MyAction1 implements ApplicationAware,RequestAware,SessionAware{
private Map<String, Object> application;
@Override
public void setApplication(Map<String, Object> arg0) {
application=arg0;
}
@Override
public void setSession(Map<String, Object> arg0) {
application=arg0;
}
@Override
public void setRequest(Map<String, Object> arg0) {
// TODO Auto-generated method stub
}
public String list() throws Exception {
application.put("r", "requestMap的内容123");
return "list";
}
}
如果你多个方法需要用到这个map,则建议用实现接口的方法
小知识:
Map<String ,Object> sessionMap=ActionContext.getContext().getSession();