Java Web :案例一

  • 需求:用户数据的增删改查
  1. 列表查询
  2. 登录
  3. 添加
  4. 删除
  5. 修改
    复杂功能
  6. 删除选中
  7. 分页查询
  8. 复杂条件查询
  • 技术需求: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>&nbsp;
<!--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);}

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值