Day09_用户信息展示案例
一、完成列表查询功能要求数据库里面存有用户的信息,现在要你点击浏览器“查询所有用户信息”就能查出所有用户的信息实现方法为了满足三层架构模型:让dao层负责查询数据库把查到的users返回,交给service层让service层把查到的users继续返回给UserListServlet,点击index.jsp的“查询所有用户信息”然后跳转到UserListServletUserListServlet
·
一、完成列表查询功能
要求
数据库里面存有用户的信息,
现在要你点击浏览器“查询所有用户信息”就能查出所有用户的信息
实现方法
为了满足三层架构模型:
Dao层负责查询所有用户数据,返回users
service层负责操作Dao层,返回users
index.jsp前端任务是写有“查询所有用户信息"的超链接,后端任务是点击超链接转到userListServlet
UserListServlet负责操作service,将users存入request域转发到list.jsp
list.jsp前端任务是表格展示用户信息,后端任务是收到users遍历users,输出
建数据库
编写User类
人家包的命名很有讲究的:
User在src下的cn.itcast.domain包里面
Userdao是dao层的,所以在src下的cn.itcast.dao包里面
UserService是service层的,所以在src下的cn.itcast.service包里面
JDBCUtils工具类在src下的cn.itcast.util包里面
控制器servlet在src下的cn.itcast.web.servlet包里面
JDBC工具类
dao层和service层的代码编写
编写index.jsp
编写UserListServlet
编写list.jsp
代码运行
二、完成登录功能
需求
分析
Dao层负责根据用户名和密码查询用户,返回user
service层负责操作Dao层,返回user
login.jsp的前端任务是做好登录页面;后端任务是从CheckCodeServlet获取到验证码,从LoginServlet获取到出错信息
CheckCodeServlet生成验证码,把生成的验证码存入session
LoginServlet的任务是做比较:
①比较验证码正确与否:从session里面获取到生成的验证码,从request域里面获取到用户填写的验证码,比较验证码,
②比较用户名和密码是否正确:操作service层负责查询该用户的username和password是否在数据库中,要是一切通过就调用index.jsp
index.jsp的前端任务是做好”xxx,欢迎你“
编码
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String verifycode = request.getParameter("verifycode");//获取用户填写验证码
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");//获取动态生成的验证码
//验证码校验(忽略大小写比较)
if(!checkcode_server.equalsIgnoreCase(verifycode)){
request.setAttribute("login_msg","验证码错误!");
request.getRequestDispatcher("/login.jsp").forward(request,response);//跳转登录页面
return;
}
//封装User对象
Map<String, String[]> map = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//调用Service查询
UserService service = new UserServiceImpl();
User loginUser = service.login(user);
//6.判断是否登录成功
if(loginUser != null){
//登录成功,由于request域没有共享数据所以存入session并且重定向跳转页面
session.setAttribute("user",loginUser);
response.sendRedirect(request.getContextPath()+"/index.jsp");
}else{
//登录失败
request.setAttribute("login_msg","用户名或密码错误!");
request.getRequestDispatcher("/login.jsp").forward(request,response);//跳转登录页面
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
三、完成添加联系人功能
Dao层finAll()方法是获取所有用户的信息,返回users ;add(user)方法是插入信息,无返回值
service层负责调用finAll()方法 和 add(user)方法
list.jsp的前端任务是表格展示数据,后端任务是点击”添加联系人“跳转到add.jsp页面
add.jsp的后端任务是带着用户填的数据跳转到”addUserServlet“
AddUserServlet获取到刚刚添加的数据,调用service层保存 ; 不带任何参数地转发到userListServlet
UserListServlet调用service层的findAll()方法查询所有用户信息,携带users转发到list.jsp,以供list.jsp遍历users展示数据
list.jsp的第二个后端功能就是拿到users数据后遍历users展示数据
四、完成删除功能
Dao层有个delete(id)方法,没有返回值
service层调用Dao层的delete(id)方法,没有返回值
list.jsp的前端任务是展示列表数据,后端任务是点击”删除“跳转到delUserServlet
delUserServlet调用service层的deleteUser(id)方法,重定向到UserListServlet页面
UserListServlet调用service层的findAll()方法查询所有用户信息,携带users转发到list.jsp,以供list.jsp遍历users展示数据
list.jsp的第二个后端功能就是拿到users数据后遍历users展示数据
五、完成修改功能
Dao层的findById(id)返回值为user
service层调用findById(id)方法,返回值为user
启动服务器默认进入index.jsp页面,点击”查询所有用户信息“后进入UserListServlet页面,UserListServlet负责操作service层的findAll()得到users,将users转发到list.jsp(这些都是之前学的)
list.jsp的前端功能是显示列表数据;后端功能是点击”修改“就带着id跳转到FindUserServlet
FindUserServlet调用service层的findUserById(id)方法,将user转发到update.jsp页面
update.jsp拿到user回显信息 ;
update.jsp 假如你做了信息修改,点击提交,它会带着信息跳转到updateUserServlet ;
updateUserServlet调用service层的updateUser(user)方法,重定向到userListServlet
UserListServlet调用service层的findAll()方法查询所有用户信息,携带users转发到list.jsp,以供list.jsp遍历users展示数据
list.jsp的第二个后端功能就是拿到users数据后遍历
1.用户信息的回显
2.用户修改
六、完成删除选中
Dao层的delete(id),无返回值
service层的delSelectedUser(ids)方法来遍历调用Dao层的delete(id),无返回值
list.jsp点击"删除选中"就判断(是否有条目被选中)和(是否确定删除),如果判断通过就提交表单,跳转到delSelectedServlet页面
delSelectedServlet获取到要删除条目的uid号,调用service层的delSelectedUser(ids)方法,然后不带任何参数的重定向到userListServlet页面
userListServlet就是拿到那些users转发到list.jsp
list.jsp的第二个后端功能就是拿到users数据后遍历
改动list.jsp(仅作了解)
后端代码编写
七、完成分页查询功能
客户端浏览器把每页能显示的条数rows传给服务器
客户端浏览器把当前页码currentPage也要传给服务器
服务器收到了rows(每页能显示的条数)和currentPage(当前页码)就可以计算开始记录的索引start
(假如一页显示5条,那么第一页是[0,5),第二页是[5,10),第三页就是[10,15),所以开始索引就是(当前页码-1)x每页显示的条数)
服务器查询数据库得到总记录数totalCount
现在dao层就可以根据(开始索引 和 每页能显示的条数)调用findByPage(start,rows,condition)方法,把每一页的数据封装到list集合里面
Dao层的findTotalCount()方法返回总记录数totalCount,findByPage(start,rows)返回List<User>
service层的findUserByPage(currentPage,rows)方法返回存有数据的PageBean
list.jsp点击“页码”可以带着参数currentPage和rows跳转到findUserByPageServlet,点击“上一页”/“下一页”也可以带着参数currentPage和rows跳转到findUserByPageServlet
index.jsp点击“查询所有用户信息”会不带任何参数地跳转到findUserByPageServlet
findUserByPageServlet可以获取到参数currentPage和rows,如果是从index.jsp跳转过来的那么参数为空,会默认设置当前页为第一页、每页显示5条数据;
如果是从list.jsp跳转过来的,参数currentPage和rows就不为空。它接着会调用service查询,将查到的数据存入request域并转发到list.jsp
list.jsp的第二个后端功能就是拿到PageBean数据后遍历
PageBean
PageBean目的是封装每页的数据
list.jsp
index.jsp
findUserByPageServlet
list.jsp遍历
运行结果
八、完成复杂查询
分析
客户端输入给服务器的就是一个一个的键值对,如果用户查询籍贯为北京的姓李的人,客户端输入给服务器的就是"name=李" "address=北京" "email=null"
服务器输出给客户端的数据包括 总人数totalCount 和 用户信息表list
totalCount要通过select count(*) from user where name like ? and adress like ? and email like ?这种语句查询
list要通过select * from from user where name like ? and adress like ? and email like ? limit ? ,?这种语句查询
用户要想查姓"李"的人,那么adress和eami就是空,该怎么定义查询语句呢?
你可以这样:String sql = "select count(*) from user where 1 = 1 ";如果有一个查询条件那就把它append到sql语句后面不久好了嘛,append(" and "+key+" like ? ");这样key可以是“name\adress\emai”
where 1 = 1干嘛用的?String sql = "select count(*) from user where"这肯定不行吧,因为“name\adress\emai”这三个参数可能都为空,所以即使where 1 = 1就可以保证即使参数都为空也可以执行sql
代码逻辑
Dao层的findTotalCount(condition)方法可以根据查询条件condition返回查询总记录数totalCount,findByPage(start,rows,condition)方法可以返回List<User>
service层的findUserByPage(currentPage,rows,condtion)方法调用了Dao层的两个方法并返回存有数据的PageBean<User>
list.jsp键入查询条件后点击"查询",可以带着参数name、address、email以及currentPage和rows跳转到findUserByPageServlet
findUserByPageServlet可以获取到参数[name , address , email , currentPage , rows]。它接着会调用service查询,将查到的数据存入request域并带着查询条件condition转发到list.jsp
list.jsp的第二个后端功能就是拿到PageBean数据后遍历,而且可以根据condition将查询条件回写
list.jsp的设置
findByPageServlet
UserDaoImpl.class添加如下代码:
@Override
public int findTotalCount(Map<String, String[]> condition) {
String sql = "select count(*) from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);//因为后期要拼接sql所以用StringBuilder的方法
Set<String> keySet = condition.keySet();//keySet为[name,adress,emai,currentPage,rowsl]
List<Object> params = new ArrayList<Object>();//
for (String key : keySet) {
//如果是currentPage和rows那就跳出循环不执行下面的语句
if("currentPage".equals(key) || "rows".equals(key)){
continue;
}
//获取value
String value = condition.get(key)[0];
//因为condition是Map<String, String[]>的,所以condition.get(key)得到的是String[],但我们知道其实这个String数组里面只有一个值
//判断value是否有值
if(value != null && !"".equals(value)){
//有值
sb.append(" and "+key+" like ? ");//value有值那就得拼接sql,注意and前面要有空格,否则就成了where 1 = 1and "+key+" like ?
params.add("%"+value+"%");
//params里面存放那些value的值,那么为什么要加两个百分号%,因为where name like "%李%"才是查询name里面带有"李"的
}
}
System.out.println(sb.toString());//假如你查询姓李的陕西人,那么获取到的sb.toString()就是"select count(*) from user where 1 = 1 and name like ? and dress like ?"
System.out.println(params);//假如你查询姓李的陕西人,那么获取到的params就是[%李% , %陕西%]
return template.queryForObject(sb.toString() , Integer.class , params.toArray());//params数组里面的值对应着sql语句的?
// Integer.class是说将结果封装为Integer类型
}
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
String sql = "select * from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
Set<String> keySet = condition.keySet();
List<Object> params = new ArrayList<Object>();
for (String key : keySet) {
if("currentPage".equals(key) || "rows".equals(key)){
continue;
}
String value = condition.get(key)[0];
if(value != null && !"".equals(value)){
//有值
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%");//?条件的值
}
}
sb.append(" limit ?,? ");//添加分页查询
//添加分页查询参数值start,rows
params.add(start);
params.add(rows);
sql = sb.toString();
System.out.println(sql);//假如你查询姓李的陕西人,那么获取到的sb.toString()就是"select count(*) from user where 1 = 1 and name like ? and dress like ? limit ?,? "
System.out.println(params);//假如你查询姓李的陕西人,那么获取到的params就是[%李% , %陕西% ,0 ,5]
return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
//new BeanPropertyRowMapper<User>(User.class)是说将结果封装到User.class里面
}
list.jsp遍历和查询条件回写
运行结果
最后list的设置
感谢浏览和收藏
更多推荐
已为社区贡献2条内容
所有评论(0)