今天开始学习struts2技术,现在struts2的技术已经超过了struts1,所以本人就没有学习struts1了,当然这个肯定不会影响我们后面的学习,先来看一下工程的目录结构:
说明:
queryAction.java就是struts2中的Action类:代码如下:
package com.struts.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import com.struts.bean.UserBean; import com.struts.service.UserService; public class queryAction extends ActionSupport { private static final long serialVersionUID = 1L; private UserBean userBean = new UserBean(); private String id; public String getId(){ return id; } public void setId(String id){ this.id = id; } public UserBean getUserBean() { return userBean; } public void setUserBean(UserBean userBean) { this.userBean = userBean; } //struts2中继承ActionSupport类,重写execute方法,这里的返回值是一个字符串类型,具体的说明到后面再说: public String execute() throws Exception { try{ //将查询结果放到request域中 HttpServletRequest request = ServletActionContext.getRequest(); UserService userService = new UserService(); request.setAttribute("userBean", userService.queryUser(id)); //setUserBean(userDb.queryUser(id));//这行代码相当于上面的三行代码,因为struts2具有属性的注入功能 return "result"; }catch(Exception e){ return "error"; } } }
下面就是UserBean类:
package com.struts.bean; public class UserBean { private String id; private String name; private String birth; private String age; private String sex; public UserBean(){ } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
这个类没什么好说的了,
再来看一下数据库接口:UserDBImpl
package com.struts.db.impl; import java.util.ArrayList; import com.struts.bean.UserBean; public interface UserDBImpl { public void init(); public ArrayList<UserBean> getData(); }
然后看一下数据库接口的实现类:
package com.struts.db; import java.util.ArrayList; import com.struts.bean.UserBean; import com.struts.db.impl.UserDBImpl; public class UserDB implements UserDBImpl{ ArrayList<UserBean> userList = new ArrayList<UserBean>(); public void init(){ for(int i=0;i<10;i++){ UserBean userBean = new UserBean(); userBean.setAge(i+""); userBean.setBirth(i+""); userBean.setId(i+""); userBean.setName("jiangwei"); userBean.setSex("男"); userList.add(userBean); } } public ArrayList<UserBean> getData(){ return userList; } }
这里就没有用数据库来访问数据了,我们是用一个list来模拟数据的
再来看一下业务层的接口:
package com.struts.service.impl; import com.struts.bean.UserBean; public interface UserServiceImpl { public UserBean queryUser(String id); } 业务层接口的实现类: package com.struts.service; import java.util.ArrayList; import com.struts.bean.UserBean; import com.struts.db.UserDB; import com.struts.db.impl.UserDBImpl; import com.struts.service.impl.UserServiceImpl; public class UserService implements UserServiceImpl{ public UserBean queryUser(String id){ UserDBImpl userDb = new UserDB(); userDb.init(); ArrayList<UserBean> userList = userDb.getData(); if(userList == null){ return null; } if(id == null){ return null; } for(int i=0;i<userList.size();i++){ if(id.equals(userList.get(i).getId())){ return userList.get(i); } } return null; } }
主要就是通过用户的id来查询用户的所有信息
这样分层的结构,看上去一点都不乱,很清晰,而且各个层之间的访问用接口来实现,降低了各个类之间的耦合性。
下面就来看看配置了:
在项目src目录下新建一个struts.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- 指定Struts 2配置文件的DTD信息 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="struts" extends="struts-default">//为action指定报名 <action name="query" class="com.struts.action.queryAction">//为action指定名称 <result name="result">/success.jsp</result>//action访问成功的跳转页面 <result name="error">/error.jsp</result>//action访问错误的跳转页面 </action> </package> </struts>
注意:
1. 这里的action:name=“query"这个是给action起一个名字,在后面的jsp页面中要用到
2. 这里的result:name定义的是上面的queryAction类中的execute方法的不同返回值,跳转到不同的页面,所以那个返回字段就决定了跳转的页面,
再来看一下给struts2配置全局的信息,在web.xml中配置:
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
配置struts2的过滤器和地址映射
在来看一下jsp页面的内容:
queryUser.jsp内容如下:
<body> <s:form action="query"> <s:textfield label="书名" name="id"></s:textfield> <s:submit value="查询"></s:submit> </s:form> </body>
注意:这里用到了struts2的标签库
1. 这里的action="query"中的名称必须和struts.xml文件中action:name的名称一样,就是表单跳转的action
2. 这里的name="id"中的id必需是queryAction中的id属性,在queryAction中id的属性值为空的,这个就是struts2自动的属性值注入功能
看一下成功跳转的页面success.jsp:
<body> id:<c:out value="${userBean.id}"></c:out> name:<c:out value="${userBean.name}"></c:out> sex:<c:out value="${userBean.sex}"></c:out> age:<c:out value="${userBean.age}"></c:out> birth:<c:out value="${userBean.birth}"></c:out> </body>
这个是用jstl标签输出用户的所有信息,这里userBean是存放在request域中的对象,在queryAction类中进行存放的.
然后不要忘了导入struts2所需的jar包,上面的图片上有所有的jar包
这样第一个struts应用就配置好了,在浏览器中输入:http://localhost:8080/..../queryUser.jsp就可以访问了。
总结:这个例子只是带我们进入struts2的世界的起点,struts2内部的更多的应用后续还需讲解