在该实例中,通过构建一个添加学生信息项目,来综合应用Struts 2的知识点,包括标签、Struts 2配置等。首先来看看添加学生信息的界面,如图3.19所示。
图3.19 添加学生信息界面
1. 建立数据库
首先建立数据库XSCJ,建立学生表XSB。
项目名 | 列名 | 数据类型 | 是否可空 | 默认值 | 说明 |
学号 | XH | char(6) | 主键 | ||
姓名 | XM | char(8) | |||
性别 | XB | bit | |||
出生时间 | CSSJ | datetime | 是 | ||
专业 | ZY | char(20) | |||
备注 | BZ | varchar(500) | 是 |
2. 建立Web项目
打开MyEclipse,建立一个Web项目,命名为“Example_Struts”。
3. 加载Struts 2的基本类库
该步骤与3.2.1节中的第3步步骤相同,这里不再赘述。
4. 修改web.xml
其内容见3.2.1节第4步。
5. 建立stu.jsp文件
在项目的WebRoot文件夹下建立stu.jsp文件,代码。
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<s:head />
</head>
<body >
<h3>添加学生信息</h3>
<s:form action="save.action" method="post" theme="simple">
<table>
<tr>
<td>学号:</td><td><s:textfield name="xs.xh"></s:textfield></td>
</tr>
<tr>
<td>姓名:</td><td><s:textfield name="xs.xm" ></s:textfield></td>
</tr>
<tr>
<td>性别:</td><td><s:radio name="xs.xb" list="#{1:'男',2:'女'}" value="1"></s:radio></td>
</tr>
<tr><td>专业:</td><td><s:textfield name="xs.zy" label="专业"></s:textfield></td>
</tr>
<tr><td width="70">出生时间:</td><td><s:datetimepicker name="xs.cssj" id="cssj" displayFormat="yyyy-MM-dd" ></s:datetimepicker></td>
</tr>
<tr>
<td> 备注:</td><td><s:textarea name="xs.bz" label="备注"></s:textarea></td>
</tr>
<tr>
<td><s:submit value="添加"></s:submit></td><td><s:reset value="重置"></s:reset></td>
</tr>
</table>
</s:form>
</body>
</html>
Struts2的标签有自动排版功能。如果想自己排版,form标签中加入theme="simple",但加入该元素后,标签中的label属性就没用了。
备注:如果是比较新的版本(比如我用的2.2.1版本),会报错“No tag "datetimepicker" defined in tag library imported with prefix "s"”。
原因:新版本中把struts2.0中的和ajax相关的,如datetimepicker,tree,treenode 都移动到了dojo中了
解决方式:
1、在jsp文件中加入<%@ taglib uri="/struts-dojo-tags" prefix="sx"%>和<sx:head/>
2、改为<sx:datetimepicker></sx:datetimepicker>
3、struts2-dojo-plugin-2.2.1.jar拷贝到/WEB-INF/lib下
4、在struts.xml增加配置
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
备注:
还可能遇到datetimepicker的乱码问题,显示的时候月份从一月到八月都可以正常显示,而到九月,十月就乱码。
解决方式一(这种方式会导致没有显示中文的“月”)
在 <sd:head />中加入:extraLocales="UTF-8"
在 <sd:datetimepicker .../>中加入:language="UTF-8"
解决方式二(推荐)
重新修改struts源码中的 dojo_zh.js和dojo_zh-cn.js文件(文件位置在: struts2-dojo-plugin-2.1.6.jar\org.apache.struts2\static\dojo\nls\下),把文件中乱码部分修改成正确的中文。
附:修改后的文件《3.7 Struts2综合应用实例的附件》
6. 建立表对应的JavaBean和DBConn类
在src文件夹下新建包“org.model”,在该包下建class文件,命名为“Xsb”,该类中有6个字段,分别为xh、xm、xb、zy、cssj和bz,并生成它们的getter和setter方法,代码如下:
package org.model;
import java.sql.Date;
public class Xsb {
private String xh;
private String xm;
private byte xb;
private String zy;
private Date cssj;
private String bz;
// 生成它们的getter和setter方法
public String getXh() {
return xh;
}
public void setXh(String xh) {
this.xh = xh;
}
public String getXm() {
return xm;
}
public void setXm(String xm) {
this.xm = xm;
}
public byte getXb() {
return xb;
}
public void setXb(byte xb) {
this.xb = xb;
}
public String getZy() {
return zy;
}
public void setZy(String zy) {
this.zy = zy;
}
public Date getCssj() {
return cssj;
}
public void setCssj(Date cssj) {
this.cssj = cssj;
}
public String getBz() {
return bz;
}
public void setBz(String bz) {
this.bz = bz;
}
}
注意,cssj为java.sql.Date类型。
在src文件夹下建立包org.work,在该包下建立class文件,命名为“DBConn”,该类负责和数据库连接,代码。
package org.work;
import java.sql.*;
import org.model.Xsb;
public class DBConn {
Connection conn;
PreparedStatement pstmt;
public DBConn(){
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;" +"databaseName=XSCJ","sa","sa");
}catch(Exception e){
e.printStackTrace();
}
}
// 添加学生
public boolean save(Xsb xs){
try{
pstmt=conn.prepareStatement("insert into XSB (XH,XM,XB,ZY,CSSJ,BZ) values(?,?,?,?,?,?)");
pstmt.setString(1, xs.getXh());
pstmt.setString(2, xs.getXm());
pstmt.setByte(3, xs.getXb());
pstmt.setString(4, xs.getZy());
pstmt.setDate(5, xs.getCssj());
pstmt.setString(6, xs.getBz());//注意顺序
pstmt.executeUpdate();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
}
补充:
使用sql语句:exec sys.sp_readerrorlog 0, 1, 'listening'可以查看sql server 2008 r2 的监听端口
7. 建立Action类SaveAction
SaveAction.java代码。
package org.action;
import org.model.Xsb;
import org.work.DBConn;
import com.opensymphony.xwork2.ActionSupport;
public class SaveAction extends ActionSupport{
private Xsb xs;
public Xsb getXs() {
return xs;
}
public void setXs(Xsb xs) {
this.xs=xs;
}
public String execute() throws Exception {
DBConn db=new DBConn();
Xsb stu=new Xsb();
stu.setXh(xs.getXh());
stu.setXm(xs.getXm());
stu.setXb(xs.getXb());
stu.setZy(xs.getZy());
stu.setCssj(xs.getCssj());
stu.setBz(xs.getBz());
if(db.save(stu)){
return SUCCESS;
}else
return ERROR;
}
}
8. 创建并配置struts.xml文件
在src文件夹下建立该文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<package name="default" extends="struts-default">
<action name="save" class="org.action.SaveAction">
<result name="success">/success.jsp</result>
<result name="error">/stu.jsp</result>
</action>
</package>
</struts>
9. 创建success.jsp页面
在WebRoot文件夹下创建success.jsp文件,代码如下:
<%@ page language="java" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
恭喜你,添加成功!
</body>
</html>
10. 部署运行
部署后,启动Tomcat,在浏览器中输入“http://localhsot:8080/Example_Struts/stu.jsp”,输入要添加的学生信息后,单击【添加】按钮,如果添加成功就会跳转到success.jsp页面。