基于JSP Servlet的项目整合
- 登陆功能的实现
- 数据库设计以及需要用到的sql语句(MySQL)
- 掌握添加前端快捷键插件的步骤
- 下载前端模板资源,熟悉模板中提供资源,实现模板的套用
- 理解MVC的编程思想
- MVC分层开发
- 好处
- 功能实现步骤
- 如何利用seesion实现登陆错误时的提示信息的显示,并且当用户刷新时,页面不再显示该提示信息?
- 退出功能的实现
- 功能实现步骤
- 注册功能的实现
- 如何在注册成功时输出提示信息?
- 功能实现步骤
- 项目优化
- 通过BaseServlet对项目结构进行优化
- 问题
- 相关代码
- 使用流程
- 通过BaseServlet对项目结构进行优化
- 项目源码及压缩包
以手写简单小项目的形式,借此掌握在实现下面功能的过程中所需要学习的技能点
登陆功能的实现
数据库设计以及需要用到的sql语句(MySQL)
代码语言:javascript复制##创建用户表
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,'abc',456,'男',20,'1996-09-09' );
delete from t_user where pwd=123;
select * from t_user;
select * from t_user where uname='张三' and pwd=12345;
掌握添加前端快捷键插件的步骤
1、右击myeclipse,点击属性,查看文件所在位置 2、将jar包放入dropins目录下(io.emmet.eclipse_1.0.0.201304090013.jar) 3、重启myeclipse 4、安装后的快捷键CTRL E 注:相关资源获取见本人博客 https://blog.csdn.net/qq_43371556/article/details/89415567
下载前端模板资源,熟悉模板中提供资源,实现模板的套用
1、创建模板对应jsp页面 2、将模板的中的所有静态资源放到WebRoot根目录下 3、将该jsp页面原有HTML代码删除,保留,将相对应模板的HTML放到该jsp下。再将保留的标签放入head标签内 4、部署项目,在浏览器上运行测试 注:相关资源获取见本人博客 https://blog.csdn.net/qq_43371556/article/details/89415567
理解MVC的编程思想
MVC分层开发
m:model service层和dao层和实体类层
v:view 视图层jsp页面
c:controller 控制层servlet
好处
1、各司其职,互不干扰。 2、有利于开发当中的分工 3、有利于组件中代码的重用
功能实现步骤
1、创建项目,导入前端模板资源,部署并在浏览器访问
2、创建相应的包,如下图
2、根据数据库设计在创建实体类,并用快捷键创建相应的取值赋值方法、带参无参构造方法以及同String方法
3、创建UserServlet,实现用户登陆业务逻辑
代码语言:javascript复制package com.bjsxt.servlet;
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.bjsxt.pojo.User;
import com.bjsxt.service.UserService;
import com.bjsxt.service.impl.UserServicesImpl;
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 uanme = req.getParameter("uanme");
String pwd = req.getParameter("pwd");
System.out.println(uanme " " pwd);
UserService us=new UserServicesImpl();
User user= us.login(uanme,pwd);
System.out.println(user);
//创建session对象
HttpSession hs = req.getSession();
if (user !=null) {
hs.setAttribute("user", user);
req.getRequestDispatcher("/main.jsp").forward(req, resp);
}else {
hs.setAttribute("error", "用户名或密码错误");
//req.getRequestDispatcher("/index.jsp").forward(req, resp);
resp.sendRedirect("/01ProjectForLogin/index.jsp");
}
}
}
4、调用业务层的方法,并在实现类中实现它
代码语言:javascript复制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 UserServicesImpl implements UserService {
UserDao ud=new UserDaoImpl();
@Override
public User login(String uanme, String pwd) {
return ud.login(uanme,pwd);
}
@Override
public int registerUser(String uname, String pwd, String sex, int age,
String birthday) {
return ud.registerUser(uname,pwd,sex,age,birthday);
}
}
5、调用dao层的方法,并在实现类中实现相关数据库查询操作
代码语言:javascript复制@Override
public User login(String uanme, String pwd) {
//jdbc查询
//创建jdbc变量
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
//创建变量
User user=null;
try {
//创建连接
conn=DBUtil.getConnection();
//创建sql语句
String sql="select * from t_user where uname=? and pwd=?";
//创建sql命令
ps=conn.prepareStatement(sql);
//给占位符赋值
ps.setString(1, uanme);
ps.setString(2, pwd);
//执行sql语句
rs=ps.executeQuery();
//遍历
while (rs.next()) {
/*int uid = rs.getInt("uid");
String uname = rs.getString("uname");
String pwd2 = rs.getString("pwd");
String sex = rs.getString("sex");
int age = rs.getInt("age");
String birthday = rs.getString("birthday");
user=new User(uid, uname, pwd2, sex, age, birthday);*/
int uid = rs.getInt(1);
String uname = rs.getString(2);
String pwd2 = rs.getString(3);
String sex = rs.getString(4);
int age = rs.getInt(5);
String birthday = rs.getString(6);
user=new User(uid, uname, pwd2, sex, age, birthday);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭资源
DBUtil.closeAll(rs, ps, conn);
}
return user;
}
6、JDBC工具类DButil的导入以及dp.properties的配置
详情跳转本人博客
https://blog.csdn.net/qq_43371556/article/details/90376271
如何利用seesion实现登陆错误时的提示信息的显示,并且当用户刷新时,页面不再显示该提示信息?
1、在登陆的方法中创session对象,并放入error属性,重定向(不能是请求转发)到登陆页面
2、在验证码框的下面通过el表达式获取该属性,然后通过jstl方式或jsp方式销毁session对象
3、如果使用jstl需要在jsp页面的头部导入其核心标签库
退出功能的实现
创建一个退出登陆的链接,通过id属性为其赋值,在利用JavaScript进行退出的确认,最后通过Servlet销毁session并重定向到jsp页面。
功能实现步骤
详情跳转本人博客
https://blog.csdn.net/qq_43371556/article/details/90301670
注册功能的实现
如何在注册成功时输出提示信息?
方法同用户登陆错误时信息的提示一样,放入session对象,并在登陆界面通过el表达式获取,并设置字体颜色为红色
功能实现步骤
1、创建相关jsp页面并导入前端模板,通过form表单将注册信息提交到Servlet中 2、创建Servlet实现相关的业务逻辑 3、调用业务层方法,并在其实现类中实现它 4、调用dao层方法,并在其实现类中实现数据库的插入操作
Servlet类
代码语言:javascript复制package com.bjsxt.servlet;
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.bjsxt.service.UserService;
import com.bjsxt.service.impl.UserServicesImpl;
public class RegisterServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取的是表单中的name属性
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 UserServicesImpl();
int i= us.registerUser(uname,pwd,sex,age,birthday);
HttpSession hs = req.getSession();
if (i!=0) {
//注册成功
hs.setAttribute("consquence", "注册成功");
resp.sendRedirect("/01ProjectForLogin/index.jsp");
}else {
//注册失败
hs.setAttribute("consquence", "注册失败");
resp.sendRedirect("/01ProjectForLogin/index.jsp");
}
}
}
业务层实现类中的方法
代码语言:javascript复制@Override
public int registerUser(String uname, String pwd, String sex, int age,
String birthday) {
return ud.registerUser(uname,pwd,sex,age,birthday);
dao层实现类中的方法
代码语言:javascript复制@Override
public int registerUser(String uname, String pwd, String sex, int age,
String birthday) {
String sql="insert into t_user values(default,?,?,?,?,?)";
Object[] objs={
uname,
pwd,
sex,
age,
birthday
};
return DBUtil.executeDML(sql, objs);
}
项目优化
通过BaseServlet对项目结构进行优化
问题
1、在一个独立的业务逻辑都创建一个Servlet并进行请求处理,但是一个网站的功能非常多,如果每一个功能都创建单独的Servlet进行处理,会造成Servlet过多,从而导致资源浪费。 2、将不同功能的的处理封装成对应的方法,在service方法中带哦用其对应的功能处理方法进行请求处理,这样servlet就只需要一个。 3、使用反射我们实现了在service中动态的根据请求调研对应的方法进行处理,但是在真实的开发过程中,虽然不会为每一个功能都创建一个Servlet,但是也不会只使用一个Servlet。一般是一个独立的功能一个Servlet。我们需要自在这些Servlet中的service方法中并将反射代码声明一遍。
相关代码
代码语言:javascript复制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();
}
}
}
使用流程
1、创建Servlet并继承BaseServlet 2、在自己的servlet中不要声明service方法,只要书写请求处理方法。 3、正常访问自己的Servlet,并在调用相关方法时,使用Base?method=UserLogin 进行访问。(Base为BaseServlet的别名。UserLogin为自己Servlet里面的方法名)
项目源码及压缩包
链接:https://pan.baidu.com/s/1qfd6X1Nyb8az_7aKfsC0ig
提取码:jsui