Struts2和Oracle数据库交互的小Demo

647 阅读5分钟

写在前面:本次文章搭配以下两篇文章进行阅读,有助于理解。


正文

数据库表格:

这里直接跳过链接数据库的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 数组等,在使用标签的时候有三个属性值得我们关注

    1. 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