专栏首页Java探索之路JSP+Servlet项目整合

JSP+Servlet项目整合

基于JSP+Servlet的项目整合

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

登陆功能的实现

数据库设计以及需要用到的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、创建相应的包,如下图

2、根据数据库设计在创建实体类,并用快捷键创建相应的取值赋值方法、带参无参构造方法以及同String方法

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属性,重定向(不能是请求转发)到登陆页面

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类

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Servlet实现的简单登陆练习

    源码分享: 链接:https://pan.baidu.com/s/1LNtaEn7RgceO1Zez9DyLRA 提取码:w739

    时间静止不是简史
  • 在javaEE中,实现用户登陆功能的实现

    时间静止不是简史
  • MyCat------基于java语言的数据库中间件

    出现勾选的即成功! 再次强调,千万不要配成主库的ip,截图中的128就是错误示范 , 三个字代表我的心情,mmp~~~

    时间静止不是简史
  • 转发和重定向又是什么“垃圾”——教你再分类

             前言:之前写了几篇JSP的博客,现在又回过头来看Servlet,温故而知新,再回顾回顾,总会有收获的。以前学习Servlet感觉内容很多,现在...

    泰斗贤若如
  • 2.Model设计

    玩蛇的胖纸
  • 细说shiro之五:在spring框架中集成shiro

    特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。 在此,以使用log4j为日志实现为例:

    2Simple
  • 用人话讲解django之数据的增删改

    在 web 开发中,最重要的是数据库的设计,就是 models 模型设计,简单的web开发说白了就是对数据库的增删改查,今天先看下数据库的增加,修改,和删除吧,...

    用户4945346
  • python 动态获取类或者函数 pkgutil 动态引入模块

    一般情况下,我们会用类似 someDict['keyName'] 的方法,来获取键值内容。但是,如果这个键名不存在的话,就会报错。所以,在不确定的地方,推荐使用...

    FungLeo
  • python列表、元组(三)

    py3study
  • Python SQLite 基本操作和经验技巧(一)

    在一个 C/C++ 程序中(或者脚本语言使用 Tcl/Ruby/Perl/Python 等) 你可以在一个特殊的名叫 SQLITE_MASTER 上执行一个SE...

    cutercorley

扫码关注云+社区

领取腾讯云代金券