写在前面:本次文章搭配以下两篇文章进行阅读,有助于理解。
- 重拾Oracle(一):与Oracle的连接
- Struts2学习之路(二):Struts2三种传值模式
正文
这里直接跳过链接数据库的DbUtil文件和Struts2的配置项。数据库表格:
第一步:编写实体类
实体类:定义Student类所需要的数据,并设置set&get方法,构造方法,重写toString方法等
复制代码
第二步:编写接口类和工厂类
接口包括对student表的增删改查和查全部。工厂类用来获得具体操作实现类。
复制代码
第三步:实现接口(实现类),设计测试类
实现类是对第二步接口的实现,编写方法体,并对写好的方法进行测试
复制代码
第四步:配置login.xml用来完成对jsp页面和后台action的关联
在Struts.xml文件中写如下代码段来完成对login.xml的配置
<include file="login.xml"/>
login.xml用来处理用户的各种操作,并分发给Action对其进行处理,并且进行结果响应。这里就是Struts2的核心部分,用户的请求通过核心控制器发送到动作映射类,动作映射类再判断是否需要调用某个Action类,然后返回给核心控制器,核心控制器决定是否创建Action类的代理类,代理类创建后,确定使用哪个方法,然后返回确认执行信息,接着就是经过层层拦截器,执行某个Action类,然后根据结果返回具体的视图,最后经过层层拦截器封装响应给客户端
以下是login.xml的具体代码
<package name="default" namespace="/" extends="struts-default">
<action name ="loginAction" class="com.huaruan.action.LoginAction">
<result name="success">Main.jsp</result>
<result name="input" type="redirect">Login.jsp</result>
</action>
<action name ="DbAction" class="com.huaruan.action.DbControlAction">
<result name="QuerryAll">QuerryAll.jsp</result>
<result name="QuerryByName">QuerryAll.jsp</result>
<result name="Delete">QuerryAll.jsp</result>
<result name="Update">ExecuteUpdate.jsp</result>
<result name="Insert">ExecuteUpdate.jsp</result>
</action>
</package>
复制代码
其中有两个Action,分别是loginAction和DbAction,分别完成对登录的控制和对数据库操作的控制(增伤改查)
result标签,根据返回字符串来完成对客户端的不同响应。
第五步:设计Login
页面具体是一个form表单,表单动作映射到loginAction动作的Login方法,提交方式是post,表单包含一个文本框和一个密码框,一个提交按钮和一个重置按钮,分别使用Strus2的标签(s)来设计。界面如图
Action类的设计采用模型驱动(模型三)的方式来做
定义方法String Login() extends ActionSupport implements ModalDriven{} 用来判断用户的输入,根据结果返回不同的字符串,以便Login.xml进行响应。
核心代码如下:
public String Login() throws Exception {
String str = null;
String name= stu.getStuName();
String pwd= stu.getStuPwd();
StudentInter student= Factory.getStudent();
Student s = student.SelectByname(name);
System.out.println(s);
if(s.getStuName()!=null) {
if(s.getStuName().equals(name)&&s.getStuPwd().equals(pwd)) {
str = SUCCESS;
}else{
str = INPUT;
}
}else {
str = INPUT;
}
return str;
}
复制代码
第六步:设计数据库交互
界面如图:
这里不做太多赘述,基本原理和login设计一样,细节部分略过。
详细介绍查询全部模块:
界面如图:
这里将数据显示在table控件中,使显示较为美观。这里获取数据的方式是Struts2的标签 <s:iterator value="list" status="st" var="student"> iterator标签。iterator标签主要是用于迭代输出集合元素,如list set map 数组等,在使用标签的时候有三个属性值得我们关注
-
- value属性:可选的属性,value属性是指一个被迭代的集合,使用ognl表达式指定,如果为空的话默认就是ValueStack栈顶的集合.
- 2.id属性:可选属性, 是指集合元素的id
- 3.可以自定义变量(var XX)
- 4.status属性:可选属性,该属性在迭代时会产生一个IteratorStatus对象,该对象可以判断当前元素的位置,包含了以下属性方法:
- int getCount(); 迭代元素个数
- int getIndex(); 迭代元素当前索引
- boolean getFirst(); 是否为第一个
- boolean getEven(); 是否为偶
- boolean getLast(); 是否最后一个
- bolean getOdd(); 是否为奇
然后看我们的代码,用来当个栗子:
<table border="1">
<tr>
<td>编号</td><td>学号</td><td>姓名</td><td>密码</td><td>性别</td><td>年龄</td><td>操作</td>
</tr>
<s:iterator value="list" status="st" var="student">
<tr>
<td><s:property value="#st.getCount()"/></td>
<td><s:property value="#student.stuId"/></td>
<td><s:property value="#student.stuName"/></td>
<td><s:property value="#student.stuPwd"/></td>
<td><s:property value="#student.stuSex"/></td>
<td><s:property value="#student.stuAge"/></td>
<td><a href="DbAction!Delete?stuId=<s:property value="#student.stuId"/> ">删除</a></td>
</tr>
</s:iterator>
</table>
复制代码
这里,list是Action给前台返回的封装数据(Student类型),var是定义的变量student,用来取出list中的对象属性值,status用来判断元素的位置。 最后一列我用来对本列进行删除操作,这里将其定义为标签,地址是转到对应的Action类中,同时携带参数stuId,用来标记删除该条信息。
各项参数的意义如下: 其中五个自定义方法,分别是:Action类中的细节:
使用模式三和模式一结合的方式来进行值传递。 如图
- Delete():用来完成删除操作
- Insert():用来完成插入(新增)操作
- SelectAll():用来完成查询全部操作
- selectByName():用来完成根据姓名查询的操作
- Update():用来完成更新操作(更改密码)
最后发布项目,测试运行。
如文中有笔误的地方,请留言告知,定会及时更正。谢谢。---Chuxus