struts2笔记整理第四天(项目实战)
2015-03-26 23:57
295 查看
第四、第五天 ***Struts2 综合练习
一、 项目本地导入
MyEclipse 新建 web project , 覆盖对应 src 和 WebRoot
Eclipse 新建 Dynamic web project , 覆盖src , 将WebRoot 中内容复制 WebContent 目录
JavaEE 企业级应用软件,布局经常采用 Frameset , 左侧菜单树使用Dtree js组件***的
目标功能 :
1、 登陆
2、 添加用户 (简历上传)
3、 组合条件 员工信息列表查询
4、 员工信息删除
5、 员工信息详情查看(简历下载)
6、 员工信息编辑
二、 数据库设计
#新建数据库
drop database if exists struts2exec;
create database struts2exec;
#创建用户 (root用户是超级管理员)
create user struts@localhost identified by 'struts';
#授权
grant all on struts2exec.* to struts@localhost;
***** Oracle和MySQL 作为应用数据库区别
mysql存在数据库概念,在企业开发中,针对一个项目创建一个单独数据库,创建单独用户, 为用户授予数据库权限 ,
oracle 一个数据库就是一个服务,在这个库中可以存在很多用户,每个用户有单独表空间 ,针对一个项目,只需要创建一个用户
#用户表
CREATE TABLE S_User(
userID INT NOT NULL AUTO_INCREMENT, #主键ID
userName VARCHAR(50) NULL, #用户姓名
logonName VARCHAR(50) NULL, #登录名
logonPwd VARCHAR(50) NULL, #密码#
sex VARCHAR(10) NULL, #性别(例如:男,女)
birthday VARCHAR(50) NULL, #出生日期
education VARCHAR(20) NULL, #学历(例如:研究生、本科、专科、高中)
telephone VARCHAR(50) NULL, #电话
interest VARCHAR(20) NULL, #兴趣爱好(例如:体育、旅游、逛街)
path VARCHAR(500) NULL, #上传路径(path路径)
filename VARCHAR(100) NULL, #上传文件名称(文件名)
remark VARCHAR(500) NULL, #备注
PRIMARY KEY (userID)
);
#初始化数据:默认用户名和密码是admin
INSERT INTO s_user (userID,userName,logonName,logonPwd) VALUES (1,'超级管理员','admin','admin');
三、 搭建开发环境
struts2 + javabean + DAO + C3P0 + DBUtils + MySQL
导入jar包 和 配置文件
web.xml
struts.xml
c3p0-config.xml
创建包结构
com.itheima.user.domain
com.itheima.user.dao
com.itheima.user.service
com.itheima.user.web.action
com.itheima.user.utils
四、 功能开发 ---- 登陆功能
内网应用系统通常不需要验证码技术
1、登陆页面 WebRoot/login/login.jsp
form元素 改造 <s:form>
* form的action 提交路径 怎么写 ?
企业中为了Action 代码可维护性,通常一个业务模块(Model)使用 一个Action
将登陆、 员工增删改查 对应业务方法 写入到 同一个Action
2、登陆表单数据校验
用户名 非空,3-12位
密码 非空
3、完成登陆逻辑,session保存用户, 跳转主页
top.jsp ${user.userName } 显示当前登陆用户
五、 功能开发 ---- 员工添加
1、 员工添加页面 WebRoot/user/add.jsp
form元素 改造 <s:form>
日期输入,使用 jquery datapicker控件
* $('#birthday').datepick({dateFormat: 'yy-mm-dd'});
<s:form action="user_add"> 访问 UserAction 中 add方法
2、 数据校验
校验出现input跳转问题,登陆页面校验失败跳转 login.jsp , 员工添加校验失败跳转 add.jsp ---- 只能配置一个input
* <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/> 完成跳转
可以 通过 @InputConfig注解,改为校验失败后 跳转视图
3、 上传简历
如果真实文件名保存,出现覆盖问题 ------------ 唯一文件名 UUID
* 在DB保存 uuid文件名路径 和 真实文件名
* 保存时注意上传文件的是否为空
六、 组合条件查询 -- 查询员工列表
1、 查询页面 WebRoot/user/list.jsp
form 改造 <s:form>
<s:form action="user_list" > 提交请求 UserAction 的 list方法
2、 条件组合查询
SQL语句 动态拼接
String sql = "select * from s_user where 1=1 ";
List<String> argList = new ArrayList<String>(); // 参数列表
if (user.getUserName() != null
&& user.getUserName().trim().length() > 0) {
sql += "and userName like ? ";
argList.add("%" + user.getUserName() + "%");
}
if (user.getSex() != null && user.getSex().trim().length() > 0) {
sql += "and sex = ? ";
argList.add(user.getSex());
}
if (user.getEducation() != null
&& user.getEducation().trim().length() > 0) {
sql += "and education = ? ";
argList.add(user.getEducation());
}
if (user.getIsUpload() != null
&& user.getIsUpload().trim().length() > 0) {
if (user.getIsUpload().equals("1")) {
// 上传简历
sql += "and filename is not null";
} else if (user.getIsUpload().equals("2")) {
// 没有上传简历
sql += "and filename is null";
}
}
3、 Action将查询结果 定义成员变量,提供getter方法 (值栈)
4、 JSP 通过struts2 标签 显示数据
* 修改指向条件查询链接
修改 left.jsp
d.add(3,2,'用户管理','${pageContext.request.contextPath}/user_list.action','','mainFrame');
修改 struts.xml
<result name="addSUCCESS" type="redirectAction">user_list</result>
<result name="listSUCCESS">/user/list.jsp</result>
七、 功能实现 --- 员工删除功能
list.jsp 点击每行数据后 删除图标,删除该行数据
删除原理: 根据id 删除
<s:a action="user_delete" namespace="/">
<s:param name="userID" value="#user.userID"></s:param>
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</s:a>
服务器根据 id 删除数据表记录
** 同时删除员工的简历
JQuery 确认删除效果
$(".delLink").click(function(event){
var isConfirm = window.confirm("想好了吗?");
if(!isConfirm){
// 阻止提交
event.preventDefault();
}
});
//JavaScript 阻止默认事件发生
function confirmDel(e){
var isConfirm = window.confirm("确认删除吗?");
if(!isConfirm){// 用户选择了取消
// 阻止默认事件
if(e && e.preventDefault){
// 火狐
e.preventDefault();
}else{
// IE
window.event.returnValue = false;
}
}
}
===============================================================================================================================================
知识点 : 表单防止重复提交
表单重复提交 危害: 刷票、 重复注册、带来服务器访问压力(拒绝服务)
防止表单重复提交原理 !!!!
1、 在jsp 通过 <s:token /> 生成令牌号
生成表单隐藏域
将令牌号保存到Session
2、 通过struts2 提供 tokenIntercetor 拦截器 完成请求中令牌号 和 session中令牌号 比较
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<action name="token" class="cn.itcast.struts2.TokenAction">
<result>/index.jsp</result>
<!-- 重新定义拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
</action>
3、 当表单重复提交时,token拦截器自动跳转 result name="invalid.token"
通过 <s:actionError/> 显示错误信息
覆盖重复提交信息 struts.messages.invalid.token=您已经重复提交表单,请刷新后重试
知识点 :struts2 的 Ajax 开发
请求数据格式:http://ddfdsfds/employee/ajaxselect?id=员工编号
返回: [{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]
Ajax开发客户端 和 服务器交互数据格式 --------------- json
* json 是最轻量级,体积最小
服务器将程序处理结果,转换为json格式发送给 客户端
* json-lib 、 flexjson 工具类库
今天要学习的是Struts2 内置json插件
* struts2-json-plugin-2.3.7.jar
案例一: 输入用户名,鼠标点击密码(触发用户名元素离焦事件),使用Ajax 将用户名发送到服务器 判断是否存在
jquery 1.4 、 1.6 新特性比较多 (企业主流 1.4 )
使用struts2 json插件
要点1 : <package> extends 继承 json-default
要点2 : <result> type 类型写 json
********** struts2 json插件 ,默认将值栈root顶端对象 所有属性返回(get方法)
不想将company属性返回 ,在get方法上 @JSON(serialize=false)
案例二 :服务器将 商品对象 List列表返回
如果Action 实现ModelDriven , model对象就是值栈栈顶对象,struts2 json插件默认 将model返回
通过设置root属性,修改插件返回 根对象
* <param name="root">action</param> 将Action作为根对象返回
只想要每个商品的 name 属性
方案一: 在pnum 、price 的get方法上 添加 @JSON(serialize=false) ========= 只要@JSON注解,属性将永远不能参与 json返回
方案二: 设置 includeProperties 属性
* <param name="includeProperties">products\[\d+\]\.name</param>
一、 项目本地导入
MyEclipse 新建 web project , 覆盖对应 src 和 WebRoot
Eclipse 新建 Dynamic web project , 覆盖src , 将WebRoot 中内容复制 WebContent 目录
JavaEE 企业级应用软件,布局经常采用 Frameset , 左侧菜单树使用Dtree js组件***的
目标功能 :
1、 登陆
2、 添加用户 (简历上传)
3、 组合条件 员工信息列表查询
4、 员工信息删除
5、 员工信息详情查看(简历下载)
6、 员工信息编辑
二、 数据库设计
#新建数据库
drop database if exists struts2exec;
create database struts2exec;
#创建用户 (root用户是超级管理员)
create user struts@localhost identified by 'struts';
#授权
grant all on struts2exec.* to struts@localhost;
***** Oracle和MySQL 作为应用数据库区别
mysql存在数据库概念,在企业开发中,针对一个项目创建一个单独数据库,创建单独用户, 为用户授予数据库权限 ,
oracle 一个数据库就是一个服务,在这个库中可以存在很多用户,每个用户有单独表空间 ,针对一个项目,只需要创建一个用户
#用户表
CREATE TABLE S_User(
userID INT NOT NULL AUTO_INCREMENT, #主键ID
userName VARCHAR(50) NULL, #用户姓名
logonName VARCHAR(50) NULL, #登录名
logonPwd VARCHAR(50) NULL, #密码#
sex VARCHAR(10) NULL, #性别(例如:男,女)
birthday VARCHAR(50) NULL, #出生日期
education VARCHAR(20) NULL, #学历(例如:研究生、本科、专科、高中)
telephone VARCHAR(50) NULL, #电话
interest VARCHAR(20) NULL, #兴趣爱好(例如:体育、旅游、逛街)
path VARCHAR(500) NULL, #上传路径(path路径)
filename VARCHAR(100) NULL, #上传文件名称(文件名)
remark VARCHAR(500) NULL, #备注
PRIMARY KEY (userID)
);
#初始化数据:默认用户名和密码是admin
INSERT INTO s_user (userID,userName,logonName,logonPwd) VALUES (1,'超级管理员','admin','admin');
三、 搭建开发环境
struts2 + javabean + DAO + C3P0 + DBUtils + MySQL
导入jar包 和 配置文件
web.xml
struts.xml
c3p0-config.xml
创建包结构
com.itheima.user.domain
com.itheima.user.dao
com.itheima.user.service
com.itheima.user.web.action
com.itheima.user.utils
四、 功能开发 ---- 登陆功能
内网应用系统通常不需要验证码技术
1、登陆页面 WebRoot/login/login.jsp
form元素 改造 <s:form>
* form的action 提交路径 怎么写 ?
企业中为了Action 代码可维护性,通常一个业务模块(Model)使用 一个Action
将登陆、 员工增删改查 对应业务方法 写入到 同一个Action
2、登陆表单数据校验
用户名 非空,3-12位
密码 非空
3、完成登陆逻辑,session保存用户, 跳转主页
top.jsp ${user.userName } 显示当前登陆用户
五、 功能开发 ---- 员工添加
1、 员工添加页面 WebRoot/user/add.jsp
form元素 改造 <s:form>
日期输入,使用 jquery datapicker控件
* $('#birthday').datepick({dateFormat: 'yy-mm-dd'});
<s:form action="user_add"> 访问 UserAction 中 add方法
2、 数据校验
校验出现input跳转问题,登陆页面校验失败跳转 login.jsp , 员工添加校验失败跳转 add.jsp ---- 只能配置一个input
* <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/> 完成跳转
可以 通过 @InputConfig注解,改为校验失败后 跳转视图
3、 上传简历
如果真实文件名保存,出现覆盖问题 ------------ 唯一文件名 UUID
* 在DB保存 uuid文件名路径 和 真实文件名
* 保存时注意上传文件的是否为空
六、 组合条件查询 -- 查询员工列表
1、 查询页面 WebRoot/user/list.jsp
form 改造 <s:form>
<s:form action="user_list" > 提交请求 UserAction 的 list方法
2、 条件组合查询
SQL语句 动态拼接
String sql = "select * from s_user where 1=1 ";
List<String> argList = new ArrayList<String>(); // 参数列表
if (user.getUserName() != null
&& user.getUserName().trim().length() > 0) {
sql += "and userName like ? ";
argList.add("%" + user.getUserName() + "%");
}
if (user.getSex() != null && user.getSex().trim().length() > 0) {
sql += "and sex = ? ";
argList.add(user.getSex());
}
if (user.getEducation() != null
&& user.getEducation().trim().length() > 0) {
sql += "and education = ? ";
argList.add(user.getEducation());
}
if (user.getIsUpload() != null
&& user.getIsUpload().trim().length() > 0) {
if (user.getIsUpload().equals("1")) {
// 上传简历
sql += "and filename is not null";
} else if (user.getIsUpload().equals("2")) {
// 没有上传简历
sql += "and filename is null";
}
}
3、 Action将查询结果 定义成员变量,提供getter方法 (值栈)
4、 JSP 通过struts2 标签 显示数据
* 修改指向条件查询链接
修改 left.jsp
d.add(3,2,'用户管理','${pageContext.request.contextPath}/user_list.action','','mainFrame');
修改 struts.xml
<result name="addSUCCESS" type="redirectAction">user_list</result>
<result name="listSUCCESS">/user/list.jsp</result>
七、 功能实现 --- 员工删除功能
list.jsp 点击每行数据后 删除图标,删除该行数据
删除原理: 根据id 删除
<s:a action="user_delete" namespace="/">
<s:param name="userID" value="#user.userID"></s:param>
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</s:a>
服务器根据 id 删除数据表记录
** 同时删除员工的简历
JQuery 确认删除效果
$(".delLink").click(function(event){
var isConfirm = window.confirm("想好了吗?");
if(!isConfirm){
// 阻止提交
event.preventDefault();
}
});
//JavaScript 阻止默认事件发生
function confirmDel(e){
var isConfirm = window.confirm("确认删除吗?");
if(!isConfirm){// 用户选择了取消
// 阻止默认事件
if(e && e.preventDefault){
// 火狐
e.preventDefault();
}else{
// IE
window.event.returnValue = false;
}
}
}
===============================================================================================================================================
知识点 : 表单防止重复提交
表单重复提交 危害: 刷票、 重复注册、带来服务器访问压力(拒绝服务)
防止表单重复提交原理 !!!!
1、 在jsp 通过 <s:token /> 生成令牌号
生成表单隐藏域
将令牌号保存到Session
2、 通过struts2 提供 tokenIntercetor 拦截器 完成请求中令牌号 和 session中令牌号 比较
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<action name="token" class="cn.itcast.struts2.TokenAction">
<result>/index.jsp</result>
<!-- 重新定义拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
</action>
3、 当表单重复提交时,token拦截器自动跳转 result name="invalid.token"
通过 <s:actionError/> 显示错误信息
覆盖重复提交信息 struts.messages.invalid.token=您已经重复提交表单,请刷新后重试
知识点 :struts2 的 Ajax 开发
请求数据格式:http://ddfdsfds/employee/ajaxselect?id=员工编号
返回: [{'name':'zhangsan','age':20},{'name':'zhangsan','age':20}]
Ajax开发客户端 和 服务器交互数据格式 --------------- json
* json 是最轻量级,体积最小
服务器将程序处理结果,转换为json格式发送给 客户端
* json-lib 、 flexjson 工具类库
今天要学习的是Struts2 内置json插件
* struts2-json-plugin-2.3.7.jar
案例一: 输入用户名,鼠标点击密码(触发用户名元素离焦事件),使用Ajax 将用户名发送到服务器 判断是否存在
jquery 1.4 、 1.6 新特性比较多 (企业主流 1.4 )
使用struts2 json插件
要点1 : <package> extends 继承 json-default
要点2 : <result> type 类型写 json
********** struts2 json插件 ,默认将值栈root顶端对象 所有属性返回(get方法)
不想将company属性返回 ,在get方法上 @JSON(serialize=false)
案例二 :服务器将 商品对象 List列表返回
如果Action 实现ModelDriven , model对象就是值栈栈顶对象,struts2 json插件默认 将model返回
通过设置root属性,修改插件返回 根对象
* <param name="root">action</param> 将Action作为根对象返回
只想要每个商品的 name 属性
方案一: 在pnum 、price 的get方法上 添加 @JSON(serialize=false) ========= 只要@JSON注解,属性将永远不能参与 json返回
方案二: 设置 includeProperties 属性
* <param name="includeProperties">products\[\d+\]\.name</param>
相关文章推荐
- SSM项目实战3.4 笔记稍后整理
- [转]Struts2 + Spring + Hibernate + DWR 项目布署笔记
- 【SSH学习笔记】整合spring3-struts2的小项目(一)
- 项目经验之:MVVM初学者图形化笔记整理。。。
- MySQL数据库设计复习笔记及项目实战
- ASP.NET项目实战学习笔记(1)
- Cocos2dx 学习笔记整理----在项目中使用图片(二)
- BBS项目笔记之二:struts2标签前台实现分页的复用
- 仿博客项目整理笔记
- Cocos2dx 学习笔记整理----第一个项目
- MySQL数据库设计复习笔记及项目实战
- 【项目管理】项目实战笔记之二:风险管理
- 【项目管理】项目实战笔记之一:高效会议的组织方法
- 电商项目笔记之一:复杂一些的struts2配置(自定义拦截器)
- Struts2学习笔记整理1
- struts2 标签实战整理
- 【项目管理】项目实战笔记之三:时间估算的三步曲
- 【SSH学习笔记】整合spring3-struts2的小项目(三)
- Cocos2dx 学习笔记整理----在项目中使用图片(一)