jsp和Servlet的整合案例

本文通过一个实际案例详细讲解了如何整合jsp和Servlet,实现用户登录、退出和注册功能。介绍了MVC模式在项目中的应用,以及在处理多个功能时如何优化Servlet设计,包括使用反射动态调用方法,以及抽取BaseServlet避免代码冗余。最后总结了Servlet+jsp+jdbc的开发流程和请求响应方式。
摘要由CSDN通过智能技术生成

**

- 项目需求

**

  • 实现用户登录
  • 实现用户登出
  • 实现用户注册
  • 功能分析:
  • 实现用户注册:根据用户名和密码查询用户信息,查有则登录成功,查无则登录失败;
  • 用户退出:销毁session;
  • 用户注册:将用户信息录入数据库;
  • 数据库设计:
  • 表名:t_user;
  • 用户id:uid;
  • 用户名:uname;
  • 用户密码:pwd;
  • 性别:sex;
  • 年龄:age;
  • 出生日期:birthday;
  • 数据库命令设计:
  • 用户登录:select * from t_user where uname=? and pwd=?;
  • 用户注册:insert into t_user values (default,?,?,?,?,?)

**

MVC模式:

**

  • M:model, 包含service层、Dao层和实体类层;
  • V:view,视图jsp页面等;
  • C:controller, 控制层,servlet层等

一、用户登录的实现

  1. 项目环境
    1)页面源码(不要只复制jsp,其他的一些也要复制进来);
    2)my-sql.connector jar包,这里用的是mysql-connector-java-5.1.30;
    3)jdbc操作工具类,DBUtil类放在util包里,db.properties;
    2.实现步骤
    1)用户点击登录发送请求到UserServlettomcat服务器收到请求后调用UserServlet中的service方法进行请求处理;并将封存了相关数据的request对象和response对象作为实参传递给service方法
    2) 在UserServlet中调用业务层方法进行登录业务处理,在业务层方法中调用Dao层方法完成数据库操作
    3)完成功能跳转

C层:
1)UserSerlvet

package com.facai.user;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.facai.pojo.User;
import com.facai.service.UserService;
import com.facai.service.impl.UserServiceImpl;
public class UserServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// 设置请求编码格式
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setContentType("text/html;charset=utf-8");
		//获取请求信息
		String uname=req.getParameter("uname");
		String pwd=req.getParameter("pwd");
		System.out.println(uname+":"+pwd);
		
		//处理请求信息
			//创建业务层
		UserService us=new UserServiceImpl();
		User u=us.getUserInfoService(uname,pwd);
		System.out.println("用户登录查询结果为:"+u);
		//响应处理结果
		//重定向
		//创建session对象
		HttpSession session=req.getSession();
		if(u!=null){
			//登录成功
			//重定向到main.jsp
			resp.sendRedirect("/project/main.jsp");
			session.setAttribute("uname",uname);
		}else{
			//登录失败

			//将登录失败的标记添加到session中
			session.setAttribute("flag", "LoginFalse");
			//重定向到login.jsp
			resp.sendRedirect("/project/login.jsp");
		}
	}
}

M层:
1)User

package com.facai.pojo;

public class User {
	private int uid;
	private String uname;
	private String pwd;
	private String sex;
	private int age;
	private String birthday;
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getBirthday() {
		return birthday;
	}
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	public User(int uid, String uname, String pwd, String sex, int age,
			String birthday) {
		super();
		this.uid = uid;
		this.uname = uname;
		this.pwd = pwd;
		this.sex = sex;
		this.age = age;
		this.birthday = birthday;
	}
	public User() {
		super();
	}
	@Override
	public String toString() {
		return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd
				+ ", sex=" + sex + ", age=" + age + ", birthday=" + birthday
				+ "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result
				+ ((birthday == null) ? 0 : birthday.hashCode());
		result = prime * result + ((pwd == null) ? 0 : pwd.hashCode());
		result = prime * result + ((sex == null) ? 0 : sex.hashCode());
		result = prime * result + uid;
		result = prime * result + ((uname == null) ? 0 : uname.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (age != other.age)
			return false;
		if (birthday == null) {
			if (other.birthday != null)
				return false;
		} else if (!birthday.equals(other.birthday))
			return false;
		if (pwd == null) {
			if (other.pwd != null)
				return false;
		} else if (!pwd.equals(other.pwd))
			return false;
		if (sex == null) {
			if (other.sex != null)
				return false;
		} else if (!sex.equals(other.sex))
			return false;
		if (uid != other.uid)
			return false;
		if (uname == null) {
			if (other.uname != null)
				return false;
		} else if (!uname.equals(other.uname))
			return false;
		return true;
	}
	
}

2)UserService接口和UserServiceImpl实现类
UserService

package com.facai.service;

import com.facai.pojo.User;

public interface UserService {
/**
 * 用户登录
 * @param uname
 * @param pwd
 * @return
 */
	User getUserInfoService(String uname, String pwd);

}

UserServiceImpl

package com.facai.service.impl;

import com.facai.dao.UserDao;
import com.facai.dao.impl.UserDaoImpl;
import com.facai.pojo.User;
import com.facai.service.UserService;

public class UserServiceImpl implements UserService {
	//创建Dao层对象
	UserDao ud=new UserDaoImpl();
	@Override
	public User getUserInfoService(String uname, String pwd) {
		// TODO Auto-generated method stub
		return ud.getUserInfoService(uname,pwd);
	}

}

3)UserDao接口和UserDaoImpl实现类
UserDao接口

package com.facai.dao;

import com.facai.pojo.User;


public interface UserDao {
	/**
	 * 根据用户名和密码查询用户信息
	 */
	
	User getUserInfoService(String uname, String pwd);

}

UserDaoImpl实现类

package com.facai.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.facai.dao.UserDao;
import com.facai.pojo.User;
import com.facai.util.DBUtil;


public class UserDaoImpl implements UserDao{

	@Override
	public User getUserInfoService(String uname, String pwd) {
		// 声明jdbc对象
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		//声明变量
		User u=null;
		try {
			//创建连接
			conn=DBUtil.getConnection();
			//创建SQL语句
			String sql="select * from t_user where uname=? and pwd=?";
			//创建SQL语句对象
			ps=conn.prepareStatement(sql);
			//给占位符赋值
			ps.setString(1,uname);
			ps.setString(2,pwd);
			//执行SQL命令
			rs=ps.executeQuery();
			//遍历
			while(rs.next()){
				u=new User();
				u.setUid(rs.getInt("uid"));
				u.setUname(rs.getString("uname"));
				u.setPwd(rs.getString("pwd"));
				u.setSex(rs.getString("sex"));
				u.setAge(rs.getInt("age"));
				u.setBirthday(rs.getString("birthday"));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//关闭资源
			DBUtil.closeAll(rs,ps, conn);
		}
		//返回结果
		return u;
	}

}

V层:
1)login.jsp(登录页面)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html>
<html lang="zh-cn">
<head>
	<base href="<%=basePath %>>">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <meta name="renderer" content="webkit">
    <title>登录</title>  
    <link rel="stylesheet" href="css/pintuer.css">
    <link rel="stylesheet" href="css/admin.css">
    <script src="js/jquery.js"></script>
    <script src="js/pintuer.js"></script>  
</head>
<body>
<div class="bg"></div>
<div class="container">
    <div class="line bouncein">
        <div class="xs6 xm4 xs3-move xm4-move">
            <div style="height:150px;"></div>
            <div class="media media-y margin-big-bottom">           
            </div>         
            <form action="user" method="post">
            <div class="panel loginbox">
                <div class="text-center margin-big padding-big-top"><h1>后台管理中心</h1></div>
                <!-- 声明java代码块 -->
                <%
                //获取session 标记
                Object obj=session.getAttribute("flag");
                if(obj!=null){
                	%>
                	<div style="text-align:center;color:red">用户名或密码错误</div>
               <%
               }
               session.invalidate(); 
                %>
                
                <div class="panel-body" style="padding:30px; padding-bottom:10px; padding-top:10px;">
                    <div class="form-group">
                        <div class="field field-icon-right">
                            <input type="text" class="input input-big" name="uname" placeholder="登录账号" data-validate="required:请填写账号" />
                            <span class="icon icon-user margin-small"></span>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="field field-icon-right">
                            <input type="password" class="input input-big" name="pwd" placeholder="登录密码" data-validate="required:请填写密码" />
                            <span class="icon icon-key margin-small"></span>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="field">
                            <input type="text" class="input input-big" name="code" placeholder="填写右侧的验证码" data-validate="required:请填写右侧的验证码" />
                           <img src="images/passcode.jpg" alt="" width="100" height="32" class="passcode"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值