前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JSP+Servlet项目整合

JSP+Servlet项目整合

作者头像
时间静止不是简史
发布2020-07-24 17:11:14
1.5K0
发布2020-07-24 17:11:14
举报
文章被收录于专栏:Java探索之路

基于JSP+Servlet的项目整合

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于JSP+Servlet的项目整合
  • 登陆功能的实现
    • 数据库设计以及需要用到的sql语句(MySQL)
      • 掌握添加前端快捷键插件的步骤
        • 下载前端模板资源,熟悉模板中提供资源,实现模板的套用
          • 理解MVC的编程思想
            • MVC分层开发
            • 好处
          • 功能实现步骤
            • 如何利用seesion实现登陆错误时的提示信息的显示,并且当用户刷新时,页面不再显示该提示信息?
            • 退出功能的实现
              • 功能实现步骤
              • 注册功能的实现
                • 如何在注册成功时输出提示信息?
                  • 功能实现步骤
                  • 项目优化
                    • 通过BaseServlet对项目结构进行优化
                      • 问题
                      • 相关代码
                      • 使用流程
                  • 项目源码及压缩包
                  相关产品与服务
                  数据库
                  云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档