第六章 Struts2深入学习一 上机.docx
《第六章 Struts2深入学习一 上机.docx》由会员分享,可在线阅读,更多相关《第六章 Struts2深入学习一 上机.docx(35页珍藏版)》请在冰豆网上搜索。
第六章Struts2深入学习一上机
第6章
Struts2深入学习
(一)
上机内容:
1.struts.xml常量配置
2.解耦访问ServletAPI
3.动态方法调用
4.实现Action接口
5.实现ActionSupport类
6.自定义处理结果
7.模型驱动
8.国际化
上机目标:
1.掌握Struts2解耦访问ServletAPI的方法
2.掌握动态方法调用
3.理解自定义处理结果
4.掌握使用模型驱动来封装用户请求参数
5.掌握Struts2国际化
阶段1:
指导
训练内容
1.使用struts.xml常量配置,避免乱码
2.解耦访问ServletAPI
3.实现Action接口
4.模型驱动
需求说明
员工薪资管理系统主要实现以下功能
(1)显示所有员工信息
(2)根据部门、拼音码查询员工
(3)为某个员工执行加班操作
(4)为某个员工执行请假操作
(5)为某个员工执行旷工操作
(6)核算所有员工当月工资
实现思路
Ø创建系统所需的sql语句,代码如下:
createsequenceseq_emp--创建序列
startwith1
incrementby1;
createtabletb_dept--创建部门表
(
Idnumberprimarykey,--自动编号,主键
dnamevarchar2(10)notnull,--部门名称
dmastervarchar2(10)notnull--负责人
);
insertintotb_deptvalues(seq_emp.nextval,'研发部','张三');
insertintotb_deptvalues(seq_emp.nextval,'市场部','李四');
insertintotb_deptvalues(seq_emp.nextval,'人事部','王五');
createtabletb_emp--创建职工表
(
Idnumberprimarykey,--自动编号,主键
empIdvarchar2(10)notnull,--员工编号
enamevarchar2(10)notnull,--员工姓名
esexvarchar2
(2)notnull,--员工性别
postvarchar2(10)notnull,--职位
basepaynumber(6,2)notnull,--基本工资
deptIdnumbernotnull,--部门编号
pymvarchar2(10)notnull,--拼音码
constraintfk_deptIdforeignkey(deptId)referencestb_dept(id)
);
insertintotb_empvalues(seq_emp.nextval,'4201','胡小军','男','教员',1200.0,1,'HXJ');
insertintotb_empvalues(seq_emp.nextval,'4202','张天朋','男','教员',1200.0,1,'ZTP');
insertintotb_empvalues(seq_emp.nextval,'4203','孙小杰','女','人事专员',1300.0,3,'SXJ');
insertintotb_empvalues(seq_emp.nextval,'4204','孙悟空','男','人事专员',1300.0,3,'SWK');
insertintotb_empvalues(seq_emp.nextval,'4205','孙科人','女','市场专员',1400.0,2,'SKR');
insertintotb_empvalues(seq_emp.nextval,'4207','刘月芬','女','市场专员',1400.0,2,'LYF');
createtabletb_overtime--创建加班表
(
Idnumberprimarykey,--自动编号,主键
emptIdnumbernotnull,--加班员工编号
hoursnumber
(2)notnull,--加班时长
reasonvarchar2(50)notnull,--加班原因
overtimeDtmdatedefaultsysdate,--加班日期
constraintfk_overtime_emptIdforeignkey(emptId)referencestb_emp(Id)
);
createtabletb_PersonalLeave--创建请假表
(
Idnumberprimarykey,--自动编号,主键
emptIdnumbernotnull,--请假员工编号
daysnumber
(2)notnull,--请假天数
reasonvarchar2(50)notnull,--请假原因
PersonalLeaveTypenumber
(1)notnull,--请假类型0:
事假1:
病假
PersonalLeaveDtmdatedefaultsysdate,--请假日期
constraintfk_PersonalLeave_emptIdforeignkey(emptId)referencestb_emp(Id)
);
createtabletb_Absence--创建旷工表
(
Idnumberprimarykey,--自动编号,主键
emptIdnumbernotnull,--旷工员工编号
daysnumber
(1)notnull,--旷工天数
memovarchar2(50)notnull,--备注
absenceDtmdatedefaultsysdate,--旷工日期
constraintfk_Absence_emptIdforeignkey(emptId)referencestb_emp(Id)
)
Ø创建用于访问数据库的JavaBean,命名为BaseDAO,代码如下:
publicclassBaseDAO{
//定义数据源驱动
privatestaticfinalStringDRIVER="oracle.jdbc.driver.OracleDriver";
//定义连接字符串
privatestaticfinalStringURL="jdbc:
oracle:
thin:
@localhost:
1521:
soft";
//定义用户名
privatestaticfinalStringUID="ht";//定义密码
privatestaticfinalStringPWD="ht";//得到连接
publicstaticConnectiongetConnection(){
Connectioncon=null;
try{
Class.forName(DRIVER);//加载驱动
con=DriverManager.getConnection(URL,UID,PWD);//获得连接
}catch(Exceptione){
e.printStackTrace();
}
returncon;
}
//有结果,有参数的sql语句
publicstaticResultrunSelectSql(Stringsql,Object[]params){
Connectioncon=null;
PreparedStatementps=null;
ResultSetres=null;
Resultresult=null;
try{
con=getConnection();//得到连接
ps=con.prepareStatement(sql);//获取PreparedStatement对象
//设置参数
for(inti=0;ips.setObject(i+1,params[i]);
}
res=ps.executeQuery();//执行sql语句,获得ResultSet对象
result=ResultSupport.toResult(res);
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
res.close();//关闭对象,释放资源
ps.close();
con.close();
}catch(Exceptione){
e.printStackTrace();
}
}
returnresult;
}
//执行没结果,有参数的sql语句
publicstaticbooleanrunUpdateSql(Stringsql,Object[]params){
Connectioncon=null;
PreparedStatementps=null;
try{
con=getConnection();//得到连接
ps=con.prepareStatement(sql);//获取PreparedStatement对象
//设置参数
for(inti=0;ips.setObject(i+1,params[i]);
}
ps.executeUpdate();//执行sql语句
returntrue;
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}finally{
try{
ps.close();//关闭连接,释放资源
con.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
//执行有结果,没参数的sql语句
publicstaticResultrunSelectSql(Stringsql){
Connectioncon=null;
PreparedStatementps=null;
ResultSetres=null;
Resultresult=null;
try{
con=getConnection();//得到连接
ps=con.prepareStatement(sql);//获取PreparedStatement对象
res=ps.executeQuery();
result=ResultSupport.toResult(res);//把ResultSet对象转换成Result对象
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
res.close();//关闭对象,释放资源
ps.close();
con.close();
}catch(Exceptione){
e.printStackTrace();
}
}
returnresult;
}
}
Ø创建用于处理”职工薪资管理系统”业务的JavaBean,命名为EmpService.java,代码如下:
publicclassEmpService
{
//得到所有职工
publicstaticMap[]getAllEmp()
{
//构造sql语句
Stringsql="selectemp.id,emp.empid,emp.ename,emp.esex,dept.dname,emp.post,emp.basepayfromtb_empemp,tb_deptdeptwhereemp.deptid=dept.id";
//执行sql语句
returnBaseDAO.runSelectSql(sql).getRows();
}
//得到所有的部门
publicstaticMap[]getAllDept()
{
//构造sql语句
Stringsql="select*fromtb_dept";
//执行sql语句
returnBaseDAO.runSelectSql(sql).getRows();
}
}
Ø创建用于处理职工薪资管理系统业务逻辑的父类控制器Action,命名为,BaseAction.java代码如下:
publicclassBaseActionextendsActionSupport{
//获取request对象
publicMapgetRequest(){
//通过ActionContext得到request对象
return(Map)ActionContext.getContext().get("request");
}
//获取session对象
publicMapgetSession(){
returnActionContext.getContext().getSession();
}
//获取application对象
publicMapgetApplication(){
return(Map)ActionContext.getContext().getApplication();
}
//获取response对象
publicHttpServletResponsegetResponse(){
//通过ServletActionContext类获取HttpServletResponse对象。
HttpServletResponseresponse=ServletActionContext.getResponse();
//设置响应头与字符编码
response.setContentType("text/html;charset=gbk");
response.setCharacterEncoding("gbk");
returnresponse;
}
}
Ø创建用于处理职工薪资管理系统业务逻辑的控制器Action,命名为,EmpAction.java代码如下:
publicclassEmpActionextendsBaseActionimplementsAction
{
//默认执行显示所有职工信息
publicStringexecute()
{
//调用业务层,获取所有职工信息
Map[]emps=EmpService.getAllEmp();
//调用业务层,获取所有部门信息
Map[]depts=EmpService.getAllDept();
//存储到request范围内
this.getRequest().put("emps",emps);
//存储到session范围内
this.getSession().put("depts",depts);
//转发到index.jsp页面
returnthis.SUCCESS;
}
}
Ø创建用于提供显示界面的JSP页面,命名为index.jsp,代码如下:
人事管理系统-员工薪资管理 |
部门: |
全部 全部 --从数据库中加载所有部门信息--> forEachvar="dept"items="${depts}"> ${dept.dname}
forEach> | 拼音码: | | submitvalue="查询"method="doQueryEmp"/> |
iftest="${! emptyemps}"> —如果存在记录--> | 姓名 | 性别 | 所属部门 | 职位 | 基本工资 | 操作 | forEachvar="emp"items="${emps}">
${emp.empid} ${emp.ename} ${emp.esex} ${emp.dname} ${emp.post} ${emp.basepay} id=${emp.id}&empid=${emp.empid}"target="_blank">加班 |
id=${emp.id}&empid=${emp.empid}"target="_blank">请假 | id=${emp.id}&empid=${emp.empid}"target="_blank">旷工 | forEach> url(images/nh-bg.gif)"> 当月薪资明细 |
if> |
Ø创建起始的JSP页面,命名为start.jsp,代码如下:
--转发到emp控制器-->
forwardpage="emp.action"/>
Ø配置struts.xml文件,代码如下:
--配置常量解决乱码,与页面布局-->
--Struts2的Action都必须配置在package里面-->
--继承自默认包-->
--定义一个login的Action类,实现类为LoginAction-->
--定义结果与视图资源的映射关系-->
/index.jsp
Ø配置web.xml文件,代码如下:
--配置Struts2的核心控制器FilterDispatcher-->
--filter名称-->
struts2
--filter实现类-->
org.apache.struts2.dispatcher.FilterDispatcher
--通过init-param配置节重新指定Struts2配置文件的位置-->
config
--指定struts.xml在WEB-INF目录下-->
struts-default.xml,struts-plugin.xml,../struts.xml
--配置filter的映射部分-->
--filter名称-->
struts2
--所有用户请求,都会被FilterDispatcher拦截-->
/*
REQUEST
FORWARD
Ø运行start.jsp页面,效果如图2.6.1:
图2.6.1运行start.jsp页面
练习
需求说明
完成员工薪资管理系统查询显示功能,可根据部门和拼音码进行组合查询。
实现思路
Ø在处理