使用MVC模式和三层开发架构,开发一个完整的“注册登录退出”模块。
系统环境:win10
JDK版本: jdk1.8.0_181
IDE版本:eclipse-java-oxygen-3a-win32-x86_64
avaEE varsion:JavaEE5 –Web2.5
Java version: 1.7.
服务器版本:apache-tomcat-7.0.69
浏览器版本:Google Chrome浏览器
通过MVC开发流程,实现项目的架构。然后利用Servlet+Jsp+Jdbc的功能开发流程,实现登陆注册退出功能。
通过DataServlet实现服务器在接收到浏览器发送的请求后,会调用对应的Servlet进行请求处理,从而将多个业务逻辑功能组合到一起。
模板的套用
MVC开发流程
Servlet+Jsp+Jdbc的功能开发流程
request和session作用域的使用
浏览器发起请求到服务器的方式(重点记忆)
BaseServlet的抽取和使用
##创建用户表
create table t_user(
uid int(10) not null auto_increment,
uname varchar(100) not null,
pwd varchar(100) not null,
sex char(4) not null,
age int(3) not null,
birthday date not null,
primary key(uid)
);
insert into t_user values(default,'张三',123,'男',18,'1988-09-09' );
insert into t_user values(default,'高淇',456,'男',20,'1996-09-09' );
package com.bjsxt.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.bjsxt.dao.UserDao;
import com.bjsxt.pojo.User;
import com.bjsxt.util.DBUtil;
/**
* 导的不是jdbc包,全是sql包
* @author 曹海洋
*
*/
public class UserDaoImpl implements UserDao {
//查询用户信息
@Override
public User getUserInfoDao(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;
}
//用户注册
@Override
public int regUserInfoDao(String uname, String pwd, String sex, int age,
String birthday) {
//创建sql语句
String sql="insert into t_user values(default,?,?,?,?,?)";
return DBUtil.executeDML(sql, uname,pwd,sex,age,birthday);
}
}
package com.bjsxt.dao;
import com.bjsxt.pojo.User;
public interface UserDao {
/**
* 根据用户名和密码,查询用户信息
* @author 曹海洋
*
*/
User getUserInfoDao(String uname, String pwd);
int regUserInfoDao(String uname, String pwd, String sex, int age,
String birthday);
}
package com.bjsxt.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 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;
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd
+ ", sex=" + sex + ", age=" + age + ", birthday=" + birthday
+ "]";
}
}
package com.bjsxt.service;
import com.bjsxt.pojo.User;
public interface UserService {
/**用户登陆
*
* @param uname
* @param pwd
* @return
*/
User getUserInfoService(String uname, String pwd);
/**用户注册
*
* @param uname
* @param pwd
* @param sex
* @param age
* @param birthday
* @return
*/
int getUserInfoService(String uname, String pwd, String sex, int age,
String birthday);
}
UserServiceImpl.java
package com.bjsxt.service.impl;
import com.bjsxt.dao.UserDao;
import com.bjsxt.dao.impl.UserDaoImpl;
import com.bjsxt.pojo.User;
import com.bjsxt.service.UserService;
public class UserServiceImpl implements UserService {
//创建Dao对象
UserDao ud = new UserDaoImpl();
@Override
public User getUserInfoService(String uname, String pwd) {
//处理登录业务
return ud.getUserInfoDao(uname,pwd);
}
//用户注册
@Override
public int getUserInfoService(String uname, String pwd, String sex,
int age, String birthday) {
//处理注册业务
return ud.regUserInfoDao(uname,pwd,sex,age,birthday);
}
}
package com.bjsxt.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class BaseServlet 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 methodName = req.getParameter("method");
//处理请求信息(动态调用方法处理请求--》反射)
try {
//反射方法获取所在类的类对象
Class cla = this.getClass();
//反射方法获取要被调用的方法对象
Method m= cla.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//反射执行的方法
m.invoke(this, req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.bjsxt.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Calendar;
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.bjsxt.pojo.User;
import com.bjsxt.service.UserService;
import com.bjsxt.service.impl.UserServiceImpl;
public class DataServlet extends BaseServlet {
/*@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求、响应编码格式
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
//获取请求信息
String methodName = req.getParameter("method");
//处理请求信息(动态调用方法处理请求--》反射)
try {
//反射方法获取所在类的类对象
Class cla = this.getClass();
//反射方法获取要被调用的方法对象
Method m= cla.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//反射执行的方法
m.invoke(this, req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}*/
//登陆处理方法
public void Userlogin(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//获取请求信息
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
//处理请求信息
System.out.println("DataServlet.Userlogin()"+uname+":"+pwd);
//创建业务层对象
UserService us = new UserServiceImpl();
User u= us.getUserInfoService(uname,pwd);
System.out.println("用户查询登陆结果为:"+u);
//响应处理结果
//直接响应
//请求转发
//获取session对象
HttpSession hs = req.getSession();
if (u!=null) {//登陆成功
//将用户信息存储到session
hs.setAttribute("user", u);
//重定向到mian.jsp
resp.sendRedirect("/16/main.jsp");
}else {//登录失败
//将登陆标记添加
hs.setAttribute("flag", "loginfalse");
//重定向到login.jsp
resp.sendRedirect("/16/login.jsp");
}
}
//退出处理方法
public void UserOut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//获取请求信息
//处理请求信息
//获取session、销毁session
HttpSession hs = req.getSession();
hs.invalidate();
//相应处理结果
//直接响应
//请求转发
//重定向
resp.sendRedirect("/16/login.jsp");
}
//注册处理方法
public void UserReg(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//获取请求信息
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
String sex = req.getParameter("sex");
int age =Integer.parseInt(req.getParameter("age")) ;
String birthday = req.getParameter("birthday");
//处理请求信息
//获取业务层对象
UserService us = new UserServiceImpl();
//处理注册
int i=us.getUserInfoService(uname, pwd,sex,age,birthday);
//相应处理结果
//获取session对象
HttpSession hs = req.getSession();
//重定向到登陆界面
if(i>0){
//注册成功,添加标记到session
hs.setAttribute("flag", "regsuccess");
resp.sendRedirect("/16/login.jsp");
}else{
//重定向到注册页面
resp.sendRedirect("/16/login.jsp");
}
}
}
package com.bjsxt.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBUtil {
//声明全局变量记录jdbc参数
private static String driver;
private static String url;
private static String username;
private static String password;
//使用静态代码块,在类加载时即完成对属性文件的读取
static{
//动态获取属性配置文件的流对象
InputStream in=DBUtil.class.getResourceAsStream("/db.properties");
//创建Properties对象
Properties p=new Properties();
//加载
try {
p.load(in);//会将属性配置文件的所有数据存储到Properties对象中
//将读取的jdbc参数赋值给全局变量
driver=p.getProperty("driver");
url=p.getProperty("url");
username=p.getProperty("username");
password=p.getProperty("password");
//加载驱动
Class.forName(driver);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建连接对象并返回
public static Connection getConnection(){
Connection conn=null;
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//关闭资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封装增加删除修改的通用工具方法
/**
* @param sql SQL语句
* @param objs SQL语句占位符实参,如果没有参数则传入null
* @return 返回增删改的结果,类型为int
*/
public static int executeDML(String sql,Object...objs){
// 声明jdbc变量
Connection conn = null;
PreparedStatement ps = null;
int i = -1;
try {
// 获取连接对象
conn = DBUtil.getConnection();
// 开启事务管理
conn.setAutoCommit(false);
// 创建SQL命令对象
ps = conn.prepareStatement(sql);
// 给占位符赋值
if(objs!=null){
for(int j=0;j
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/project
username=root
password=root
15Progect
This is the description of my J2EE component
This is the display name of my J2EE component
UserServlet
com.bjsxt.servlet.UserServlet
This is the description of my J2EE component
This is the display name of my J2EE component
OutServlet
com.bjsxt.servlet.OutServlet
This is the description of my J2EE component
This is the display name of my J2EE component
RegServlet
com.bjsxt.servlet.RegServlet
This is the description of my J2EE component
This is the display name of my J2EE component
DataServlet
com.bjsxt.servlet.DataServlet
UserServlet
/user
OutServlet
/out
RegServlet
/reg
DataServlet
/data
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
网站信息
网站信息
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
登录
<%@page import="com.bjsxt.pojo.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
chy参与管理系统修改
chy超级管理系统
欢迎:<%=( (User)session.getAttribute("user")).getUname() %>进入系统 退出登录
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
新用户注册
很多时候出现的bug,都是因为自己粗心所导致的。例如页面无法跳转多半是因为重定向的路径没有写对、或者form表单的action没写对、亦或是href后的路径没有写对,要特别注意。
在一开始时,每个请求或独立的业务逻辑(登陆、退出、注册)都要单独使用一个Servlet进行处理。但随着网站功能的增多,Servlet增多导致资源浪费,需要我们进一步的优化。使用反射动态调用其功能处理方法,并将相关的Servlet集成在一个Servlet上。
虽然使用了反射集成了一个独立的业务逻辑,但是反射不会只使用一次,需要我们在一些Servlet中的service方法中的反射代码声明一遍,然后使用时直接继承声明该反射代码的类。而且,该类最好不能被访问到(删除相应的url-pattern),最好不能被实例化(声明为抽象类)。
刚接触JavaEE项目,需要掌握的知识点很多而且很杂,学起来比较吃力。但是这些零碎的知识点恰恰是今后做项目的基础。我还在不断花费时间去吸收、去归纳这些知识,相信通过本章的学习,我能够更加轻松的掌握这些知识!
链接:https://pan.baidu.com/s/1ylOi3PXFy6nwoOyVGVrBeg
提取码:yvsn
复制这段内容后打开百度网盘手机App,操作更方便哦