文章目录
- 列表查询
- 登录功能
- 添加功能
- 删除功能
- 修改功能
- 选中删除
- domain包-----User1.java
- index2.jsp
- web包----Servlet-----UserListServlet.java
- UserService4.java
- Service --- impl --- UserServiceImpl5.java
- dao---UserDao--UserDao6.java
- dao -- impl--UserDaoImp7l.java
- List.jsp
- Login.jsp
- servlet ---LoginServlet.java
- add.jsp
- Servlet ---- AddUserServlet.java
- Servlet ----DelUserServlet.java
- Update.jsp
- findUserServlet.java
- UpdateUserServlet.java
- DelSeletctedServlet.java
- 需求:用户数据的增删改查
- 列表查询
- 登录
- 添加
- 删除
- 修改
复杂功能 - 删除选中
- 分页查询
- 复杂条件查询
- 技术需求:Servlet + JSP + MySQL + JDBCTemplate + Durid(连接池)
+BeanUtils(封装数据) - 数据库设计:
Servlet可以有多个,service一个就够,功能多为其函数
数据库(1):
create database day2;-- 创建数据库
use day2; -- 使用数据库
create table user{ -- 创建表
id int primary key auto_increment,
name varchar(20) not null;
gender varchar(5),
age int ,
address varchar(32),
qq varchar(20),
email varchar(50)
username varchar(15);
password varchar(15);
};
-
开发:
一、环境搭建
1.创建数据库环境
2.创建项目,导入jar包
二、编码 -
测试
-
部署运维
列表查询
登录功能
添加功能
删除功能
修改功能
选中删除
domain包-----User1.java
private int id;
private String name;
private String gender;
private int age;
private String address;
private String qq;
private String email;
private String username;
private String password;w
public void setId(int id){
this.id=id;
}
public void setName(String name){
this.name=name;
}
public void setGender(String gender){
this.gender=gender;
}
public void setAge(int id){
this.age=age;
}
public void setAddress(String){
this.address=address;
}public void setQq(int qq){
this.qq=qq;
}public void setEmail(String email){
this.email=email;
}
public void setIUsername(String username){
this.ue=sername=username;
}
public void setPassword(String password){
this.password=password;
}
public int getId(){
retrun id;
}
public String getName(){
retrun name;
}
public String getGender(){
retrun gender;
}
public int getAge(){
retrun age;
}
public String getAddress(){
retrun address;
}
public String getQq(){
retrun qq;
}
public String getEmail(){
retrun email;
}
public String getUsername(){
retrun username;
}
public String getPassword(){
retrun password;
}
public String toString(){
return "User{"+
"ids=' "+id+
",names=' "+name+'\''+
",gender=' "+gender+'\''+
",age=' "+age+'\''+
"address=' "+address+'\''+
"qqs=' "+qq+'\''+
"emails=' "+ eamil+ '\''+
"username=' "+ eamil+ '\''+
"passwords=' "+ eamil+ '\''+
')';
}
}
index2.jsp
~~
//page对象是整个页面对象,通过它可以调用函数查询文件路径,这样就可以实现动态路径了
<a href="${pageContext.reuqest.contexPath}/userListServlet" style="...">
查询用户信息
</a>
web包----Servlet-----UserListServlet.java
实现查询数据库所有信息,并封装数据给 list.jsp
package cn.itcast.web.servlet;
import...
@webServlet("userListServlet")
public class UserListServlet extends HttpServlet{
protected void doPost(HttpServletRequest request ,HttoServletResponse response)throw ServletException{
//1.调用service完成查询
UserService4 service= new UserServiceImpl5();
List<User> users =service.findAll();
//2.将list存入request 中
request.serAttribute(users);
//3.转发到页面 list.jsp
request.getRequestDispatcher("/list.jsp").forword(request,response);
/*通过浏览器访问查询页面jsp ,则发出request,通过服务器处理 得到 user数据,然后通过转发将数据存储在request
中实现共享,因为转发,要跳转页面,所以要访问列表页面jsp 会发出刚存储数据后的
request,去访问服务器,服务器再吸收user数据*/
}
protected void doGet(HttpServletRequest request,HttoServletResponse response)throw ServletException{
this.doPost(request,response);
}
UserService4.java
import...
//1.用户管理的的业务接口
public interface UserService{
//2.查询所有用户信息
public List<User>findAll();
//3.登录方法
User login(User user);
/4./添加user
void addUser(User user);
//5.删除user
void deleteUser(String id);
//6.1修改user(根据id 查询)
User findUserById(String id);
}
//6.2修改user(提交数据进行修改)
void updateUser(User user);
//7.删除选中
void delSelectedUser(String[] ids);
Service — impl — UserServiceImpl5.java
pack cn.itcast.service.impl;
import cn.itcast.domain.User1;//即user类
import cn.itcasr.service.UserService4;//UserService类
import java.util.List;
public class UserServiceIml5 implements UserService4{
private UserDao dao = new UserDaoImpl();
//1.调用dao 实现去数据库查询信息
public List<User> findAll(){
return dao.findAll();
}
//2.功能:传入已经将用户名和密码封装成的user对象,通过获取两个信息然后调用函数查询
public User login(User user){
return dao.findUserByUsernameAndPassword(user.getusername(),user.getPassword);
}
//3.
public void addUser(User user){
dao.add(user);
}
//4.
public void deleteUser(String id){
dao.delete(Integer.parseInt(id));//强制转化id为整型
}
//5.1
public User findUserById(String id){
return dao.findById(id);
}
//5.2
public void updateUser(User user){
dao.update(user);
}
//5.3
public void delSelectedUser(String[] ids){
//1.遍历数组
for(String id:ids){
//2.调用dao删除
dao.delete(Integer.parseInt(id));//函数功能复用
}
}
}
dao—UserDao–UserDao6.java
package cn.itcast.dao;
package cn.itcast.domain;//因为用到User对象所以导入
//用户操作Dao
public interface UserDao{ //数据库操作接口
public List<User>findAll();
User findUserByUsernameAndPassword(String username, String password);
void add(User user);
void deleteUser(String id);
User findById(Integer.parseInt (id));
void update(User user);
}
dao – impl–UserDaoImp7l.java
import cn.itcast.dao.UserDao;
import cn.itcast.damain.User;
import cn.itcast.util.JDBCUtils;//把之前弄好的JDBC放在工具包里,这样不用再写一遍了
//实现数据库操作接口类
//使用JDBC操作库
public class UserDaoImpl7 implements UserDao6{
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//采用spring 的JDBCUtil,定义为为全局,这样下面用的时候就不用new 了
public List<User> findAll(){
//1.定义sql
String sql = "select *from user";
List <User> users=template.query(sql,new BeanProperRowMapper<User>(User.class))
return users;//通过spring JDBCTemplate 和连接池 来实现查询结果自动封装成Javabean类型对象,详细看连接池章节最后部分
}
//功能:在数据库查询是否有这个用户名和密码
public User findUserByUsernameAndPassword(String username, String password){
try{
String sql = "select*from user where username=? and password = ?;"
//查询成功后,将新增和原有的数据一起封装在user对象里面,返回user对象
User user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),username,password);
return user;//查询到返回user
}catch (Exception e){
e.prinStackTrace();
return null;//查询不到返回null
}
public void add(User user){
//1.定义sql
String sql "insert into user values(null,?,?,?,?,?,?,null,null);"
//2.执行sql
template.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());
}
public void delete(int i){
String sql = "delete fromuser where id = ?";
template.Update(sql,id);// id作为参数,为? 赋值
}
public User findById(int id){
String sql = "alter *from user where id = ?" ;
return template.queryFOrObject(sql,new BeanpropertyRowMapper<user>(User.class),id);
}
public void add(User user){
//1.定义sql
String sql "update user set name=?,gender=?,age=?,address=?,qq=?,email=? where id=?);"
//2.执行sql
template.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getId());
}
}
List.jsp
<script>
funciton deleteUser(${id}){//因为id是在下面的,写在外面,是获取不到值得的,所以传参
//用户安全提示
if(confirm("您确定删除吗?")){
location.herf="${pageContext.request.contextPath}delUserServlet?id="+id;
//确定的话直接执行
}
}
window.onload = funciton (){
//给删除选中的按钮添加单击事件
document.getElementById("delSelected").onclick = function(){
//将表单(id = “form” )提交
document.getElementById("form").submit();
}
}
</script>
<!--利用表单,添加复选框-->
<form id="form" action="${pageContext.request,contextPath}/delSelectedServlet" method="post">
<table border= "1" class = "table-bordered table-hover">
<tr class="success">
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>籍贯</th>
<th>QQ</th>
<th>邮箱</th>
<th>操作</th>
</tr>
<!--users 现在是一个List集合,里面放着类型为user的对象 -->
<!--users 现在放在request域中,$(users)意思:在EL中的多个域中寻找 键名为users,并取出值,var指取出值得类型,varStatus指表中的序号 -->
<c:forEach items="$(users)" var="user" varStatus= "s">
<tr class="success">
<td><input type="checkbox" name="uid" value="${user.id" } ></td>//定义复选列,和提交值得名字uid
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.gender}</td>
<td>${user.age}</td>
<td>${user.address}</td>
<td>${user.qq}</td>
<td>${user.email}</td>
<td><a class="btn btn-default btn-sm" href="$(pageContext.request.contextPath)/findUserServlet?id=${user.id}">修改</a>
<!--list页面有多个修改按钮,他是怎么知道按哪个返回哪个user的id?-->
<a class="btn btn-default btn-sm" href="javascript:deleteUser(user.id);">删除</a></td>
<!--点击删除按钮,则会使用javascript的函数(写在上面)-->
<!--数据库表中的id 项对删除功能很重要,在访问delUserServlet时候,将id值传送过去,建名就叫做id-->
<a class="btn btn-primary btn-sm" href="javascript:void(0);" id="delSelected" >删除选中</a>
</tr>
<c:foreach>
</table>${pageContext.request.contextPath}/delUserServlet?id=${user.id}
</form>
二:登录
Login.jsp
<script type="text/javascript">
function refleshCode()
{
//1.获取验证码对象
var vcode=document.getElementById("vcode")
//2.设置src 属性,加时间戳
vcode.src="${pageContext.request.contextPath}/checkCode?time="+new Dare.getTime();
}
</script>
<!--name属性是存值传送的键名,id是提示程序员?placecholder 是显示jsp页面上的提示-->
<div classs="form-group">
<label for="user">用户名:</lable>
<input type="text" name="username" class="form-control" id="user" placecholder="请输入用户名"/>
</div>
<div classs="form-group">
<label for="user">密码:</lable>
<input type="text" name="password" class="form-control" id="password" placecholder="请输入密码"/>
</div>
<div class="form-inline">
<label for="vcode">验证码</lable>
<input type="text" name="verifycode" class="form-control" id="verifycode" prlaceholer="请输入验证码"></input>
<a href="javascript:refreshCode()"><img src="${pageContext.request.contextPath}/checkCode" title="看不清点击刷新" id= "vcode"</a>
<h3>登录</h3>
<form action="${pageContext.request.contextPath}/loginServlet" methods="post">
....
</div>
servlet —LoginServlet.java
实现对登录功能:查询和判断是否登录
package cn.itcast.web.servlet;
import...
@webSerlet("/loginServlet")
public class LoginServlet extends HttpServlet{
protected void doPost(HttpServletRequest request,HttoServletResponse response)throw ServletException{
//1.设置编码
request.setCharacterEncoding("utf-8");
//2.获取数据
//2.1用户填写的验证码,用过浏览器提交表单,放在request中,名字vorifycode
String verifycods=request.getParameter("verifycode");
Map<String,String[]> map=request.getParameter();//从request中获取所有的键值对,即 用户名和密码
//3.校验验证码
HTTPSession session = request.getSession();
String checkcode_server=session.getAttribute("CHECKCODE_SERVER");//这是电脑自动生成的验证码,放在checkcode_server变量中
session.removeAttribute("CHECKCODE_SERVER");//确保验证码一次性,不保留
if(check_server.qualsIgnoreCase(verifycode)){
//验证码不正确
//提示信息
request.setAttribute("login_mag","验证码错误")//login_mag是什么?待解决
//跳转登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
//4.封装user对象(即用户名和密码封装在里面了)
User user=new User();
try{
BeanUtils.populate(user,map);//封装成user对象
}catch (IllegalAccessException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.prinStackTrace();
}
//5.验证码验证成功后调用Service查询数据库,来验证用户名和密码
UserService service= new UserServiceImpl();
User loginUser=service.login(request.getContextPath()+"/index.jsp");
//用动态路径
//6.判断是否登录成功
if(loginUser!=null){
//登录成功
//user对象存入session(因为要返回给浏览器)
session.setAttribute("user",loginUser);
//跳转页面(重定向) 因为request中没有共享数据??待解决,所以用重定向
//估计是验证成功可以登录,并把放行许可的消息放在session中返回给浏览,告诉浏览器下次登录的地址
//但是为什么不能在服务器端进行一次转发,来到允许登录页面,并respose给浏览器显示呢?? 待解决
response.sendRedirect(request.getContextPth()+"/index.jsp");
}else{//登录失败
request.setAttributte("login_mag","用户名或密码错误!")
//跳转到登录页面页面
request.getRequestDispatcher("/login.jsp").forward(requewoar,response);
}
}
protected void doGet(HttpServletRequest request,HttoServletResponse response)throw ServletException{
this.doPost(request,response);
}
}
三:添加
add.jsp
<form action="${pageContext.request.contextPath}/addUserServlet" methods="post">
<div classs="form-group">
<label for="name">姓名:</lable>
<input type="text" name="name" class="form-control" id="name" placecholder="请输入名字"/>
</div>
<div classs="form-group">
<label for="name">性别:</lable>
<input type="radio" name="gender" value="男" checked="checked"/>男
<input type="radio" name="gender" value="女" checked="checked"/>女
</div>
<div classs="form-group">
<label for="age">年龄:</lable>
<input type="text" name="age" class="form-control" id="age" placecholder="请输入年龄"/>
</div>
...
<input class="btn btn-primary" type="submit" value="提交"/>
<input class="btn btn-primary" type="submit" value="重置"/>
<input class="btn btn-primary" type="submit" value="返回"/>
Servlet ---- AddUserServlet.java
package cn.itcast.web.servlet;
import...
@webServlet("/addUserServlet")
public class UserListServlet3 extends HttpServlet{
protected void doPost(HttpServletRequest request ,HttoServletResponse response)throw ServletException{
//1.设置编码
request.setCharacterEncoding("utf-8");
//2.获取参数
Map<String,String[]> map=request.getParameter();//从request中获取所有的键值对封装成一个map集合
//3.封装对象
User user=new User();
try{
BeanUtils.populate(user,map);//封装成user对象
}catch (IllegalAccessException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.prinStackTrace();
}
//4.调用service保存
UserService service = new UserServiceTmpl();
service.addUser(user);
//5.跳转到UserListServlet
response.sendRedirect(request.getContextPth()+"/UserListServlet");
}
protected void doGet(HttpServletRequest request,HttoServletResponse response)throw ServletException{
this.doPost(request,response);
}
四:删除
Servlet ----DelUserServlet.java
package cn.itcast.web.servlet;
import...
@webServlet("/delUserServlet")
public class DelUserServlet extends HttpServlet{
protected void doPost(HttpServletRequest request ,HttoServletResponse response)throw ServletException{
//1.获取id
String id = request.getParameter("id");
//2.调用service删除
UserService service = new UserServiceImpl();
service.deleteUser(id);
//跳转到查询所有数据的Servlet(useListServlet就是查询所有信息的功能)
response.sendRedirect(request.getContextPth()+"/userListServlet.jsp");
}
protected void doGet(HttpServletRequest request,HttoServletResponse response)throw ServletException{
this.doPost(request,response);}
}
五:修改
Update.jsp
<@taglib prefix="c" url="http://java.sun.cin/jsp/jstl/core"%>
<form action="${pageContext.request.contextPath}/updateUserServlet" methods="post">
<div classs="form-group">
<h3 style="...">修改联系人</h3>
<!-- 这是个隐藏域 提交id-->
<input type="hidden" name="id" value="${user.id}">
<label for="name">姓名:</lable>
<input type="text" name="name" class="form-control" id="name" value="${user.name}" readonly="readonly" placecholder="请输入名字"/>
</div>
<div classs="form-group">
<label for="name">性别:</lable>
<!-- 回写需要一个判断条件,利用jstl标签-->
<c:if test="${user.gender=='男'}">
<input type="radio" name="gender" value="男" checked="checked"/>男
<input type="radio" name="gender" value="女" />女
</c:if>
<c:if test="${user.gender=='女'}">
<input type="radio" name="gender" value="男" />男
<input type="radio" name="gender" value="女" checked="checked"/>女
</c:if>
</div>
<div classs="form-group">
<label for="age">年龄:</lable>
<input type="text" name="age" class="form-control" id="age" value="${user.age}" placecholder="请输入年龄"/>
</div>
...
<input class="btn btn-primary" type="submit" value="提交"/>
<input class="btn btn-primary" type="submit" value="重置"/>
<input class="btn btn-primary" type="submit" value="返回"/>
findUserServlet.java
进行复写
package cn.itcast.web.servlet;
import...
@webServlet("/findUserServlet")
public class FindListServlet3 extends HttpServlet{
protected void doPost(HttpServletRequest request ,HttoServletResponse response)throw ServletException{
//1.设置编码
request.setCharacterEncoding("utf-8");
//2调用Service,获取查询到为该Id 的用户信息user
User user = service.findUserById(id);
//3.存到request中
request.setAttribute("user",user);
//4.转发到update.jsp中,实现复写
request.getRequestDispatcher(/update.jsp).forward(request,response);
protected void doGet(HttpServletRequest request,HttoServletResponse response)throw ServletException{
this.doPost(request,response);}
}
UpdateUserServlet.java
进行修改提交
package cn.itcast.web.servlet;
import...
@webServlet("/updateUserServlet")
public class UpdateUserServlet extends HttpServlet{
protected void doPost(HttpServletRequest request ,HttoServletResponse response)throw ServletException{
//1.设置编码
request.setCharacterEncoding("utf-8");
//2.获取参数
Map<String,String[]> map=request.getParameter();//从request中获取所有的键值对封装成一个map集合
//3.封装对象
User user=new User();
try{
BeanUtils.populate(user,map);//封装成user对象
}catch (IllegalAccessException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.prinStackTrace();
}
//4.调用Service 修改
UserService service = new UserServiceImpl();
service.udpateUser(user);
//5.跳转到查询所有的Servlet(进行显示到页面)
response.sendRedirect(request.getContextPth()+"/UserListServlet");
protected void doGet(HttpServletRequest request,HttoServletResponse response)throw ServletException{
this.doPost(request,response);}
List页面给表单增加复选列,再在JavaScript为“删除选中”按钮添加单机事件,再提交整个表单
DelSeletctedServlet.java
实现批量删除
package cn.itcast.web.servlet;
import...
@webServlet("/updateUserServlet")
public class UpdateUserServlet extends HttpServlet{
protected void doPost(HttpServletRequest request ,HttoServletResponse response)throw ServletException{
//1.获取id
String []ids=request.getParameterValues("uid");//ids是个数组
//2.调用service删除
UserService service = new UserServiceTmpl();
service.delSelectedUser(ids);
//3.跳转查询所有UserListServlet
response.sendRedirect(request.getContextPth()+"/UserListServlet");
}
protected void doGet(HttpServletRequest request,HttoServletResponse response)throw ServletException{
this.doPost(request,response);}
}