JSP+Servlet项目整合

基于JSP+Servlet的项目整合

  • 登陆功能的实现
    • 数据库设计以及需要用到的sql语句(MySQL)
    • 掌握添加前端快捷键插件的步骤
    • 下载前端模板资源,熟悉模板中提供资源,实现模板的套用
    • 理解MVC的编程思想
      • MVC分层开发
      • 好处
    • 功能实现步骤
    • 如何利用seesion实现登陆错误时的提示信息的显示,并且当用户刷新时,页面不再显示该提示信息?
  • 退出功能的实现
    • 功能实现步骤
  • 注册功能的实现
    • 如何在注册成功时输出提示信息?
    • 功能实现步骤
  • 项目优化
    • 通过BaseServlet对项目结构进行优化
      • 问题
      • 相关代码
      • 使用流程
  • 项目源码及压缩包

以手写简单小项目的形式,借此掌握在实现下面功能的过程中所需要学习的技能点

登陆功能的实现

数据库设计以及需要用到的sql语句(MySQL)

##创建用户表
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、创建相应的包,如下图
JSP+Servlet项目整合_第1张图片
2、根据数据库设计在创建实体类,并用快捷键创建相应的取值赋值方法、带参无参构造方法以及同String方法
JSP+Servlet项目整合_第2张图片
3、创建UserServlet,实现用户登陆业务逻辑

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、调用业务层的方法,并在实现类中实现它

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层的方法,并在实现类中实现相关数据库查询操作

@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属性,重定向(不能是请求转发)到登陆页面
JSP+Servlet项目整合_第3张图片
2、在验证码框的下面通过el表达式获取该属性,然后通过jstl方式或jsp方式销毁session对象
JSP+Servlet项目整合_第4张图片
3、如果使用jstl需要在jsp页面的头部导入其核心标签库
JSP+Servlet项目整合_第5张图片

退出功能的实现

创建一个退出登陆的链接,通过id属性为其赋值,在利用JavaScript进行退出的确认,最后通过Servlet销毁session并重定向到jsp页面。

功能实现步骤

详情跳转本人博客
https://blog.csdn.net/qq_43371556/article/details/90301670

注册功能的实现

如何在注册成功时输出提示信息?

方法同用户登陆错误时信息的提示一样,放入session对象,并在登陆界面通过el表达式获取,并设置字体颜色为红色

JSP+Servlet项目整合_第6张图片

JSP+Servlet项目整合_第7张图片

功能实现步骤

1、创建相关jsp页面并导入前端模板,通过form表单将注册信息提交到Servlet中
2、创建Servlet实现相关的业务逻辑
3、调用业务层方法,并在其实现类中实现它
4、调用dao层方法,并在其实现类中实现数据库的插入操作

Servlet类

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");
		}
		
	}
}

业务层实现类中的方法

@Override
	public int registerUser(String uname, String pwd, String sex, int age,
			String birthday) {
		
		return ud.registerUser(uname,pwd,sex,age,birthday);

dao层实现类中的方法

@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方法中并将反射代码声明一遍。

相关代码

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
复制这段内容后打开百度网盘手机App,操作更方便哦

你可能感兴趣的:(JavaEE和项目开发,JAVA小窝(笔记),JavaEE项目之旅)