为了对Javaweb中的JSP、Servlet以及Listener和Filter进行简单的总结,创建一个简单的只有登录和注册的小项目,项目采用MVC结构并结合了MyBatis进行简单的数据库操作。项目效果示例如下:
登录页面:
登录时账号或密码错误:
注册页面:
junit
junit
4.11
test
javax.servlet
javax.servlet-api
3.1.0
provided
org.mybatis
mybatis
3.4.6
mysql
mysql-connector-java
8.0.27
log4j
log4j
1.2.12
org.slf4j
slf4j-api
1.7.12
org.slf4j
slf4j-log4j12
1.7.12
jstl
jstl
1.2
taglibs
standard
1.1.2
项目中使用了Mybatis作为持久层,因此需要xml配置文件进行配置,并且需要SqlSessionFactory对象,以便获取SqlSession用以操作数据库。
使用Mybatis,必然要有SqlSessionFactory类,此处使用ServletContextListener上下文参数监听者,在Context参数创建的时候,对SqlSessionFactory类进行初始化。如下BaseMapperTest类用于初始化创建SqlSessionFactory:
public class BaseMapperTest {
private static SqlSessionFactory sqlSessionFactory;
/**
* 使用xml配置文件,初始化SqlSessionFactory
*/
public static void init(String config){
try{
Reader reader= Resources.getResourceAsReader(config);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
}catch(IOException ex){
ex.printStackTrace();
}
}
/**
* 由SqlSessionFactory工厂对象,生产SqlSession
* @return
*/
public static SqlSession getSqlSession (){
return sqlSessionFactory.openSession();
}
}
通过部署监听者MyServletContextListener类,在上下文参数Context初始化的时候,调用BaseMapperTest类的init()方法,实现对SqlSessionFactory的初始化。
/**
* 上下文初始化参数监听者
*/
public class MyServletContextListener implements ServletContextListener {
/**
* 参数初始化
* @param servletContextEvent
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//由事件得到ServletContext
ServletContext sc = servletContextEvent.getServletContext();
String config = sc.getInitParameter("config"); //获取ServletContext初始参数
BaseMapperTest.init(config); //上下文初始化参数的时候,使用xml配置文件,初始化SqlSessionFactory
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
使用Mybatis,需要将具体的sql语句入mapper.xml文件中,如下所示:
insert into `user`(
user_name, user_password, create_time)
values(#{userName}, #{userPassword}, #{createTime, jdbcType=TIMESTAMP})
对应mapper.xml文件的映射接口如下所示:
/**
* 接口文件
*/
public interface UserMapper {
/**
* 新增用户
*
* @param sysUser
* @return 返回影响行数
*/
int insert(User sysUser);
/**
* 通过ID查询用户
* @param id
* @return
*/
User selectById(int id);
/**
* 查询符合登录条件的用户数
* @return
*/
long selectUser(User sysUser);
}
如下为对应数据库user表格的实体类:
/**
* 对应数据库user表格的实体类
*/
public class User {
private int id;
private String userName;
private String userPassword;
private Date createTime;
public int getId() {
return id;
}
public String getUserName() {
return userName;
}
public String getUserPassword() {
return userPassword;
}
public Date getCreateTime() {
return createTime;
}
public void setId(int id) {
this.id = id;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
service操作中包含两个类,分别对应于登录操作以及注册操作,如下所示:
/**
* 用户登录
*/
public class LoginUser {
private String userName;
private String userPassword;
public LoginUser(String userName,String userPassword){
this.userName = userName;
this.userPassword = userPassword;
}
/**
* 登录判断
* @return
*/
public User login(){
User result = null;
SqlSession sqlSession = BaseMapperTest.getSqlSession(); //获取数据库操作对象
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUserName(userName);
user.setUserPassword(userPassword);
//将新建的对象插入数据库中,返回值result 是执行的SQL影响的行数
long res = userMapper.selectUser(user);
if(res>0){
result = user;
}else{
result = null;
}
} catch(Exception e){
e.printStackTrace();
} finally{
sqlSession.close(); //关闭链接
}
return result;
}
}
/**
* 用户注册
*/
public class RegistUser {
private String userName;
private String userPassword;
public RegistUser(String userName, String userPassword){
this.userName = userName;
this.userPassword = userPassword;
}
/**
* 注册
* @return
*/
public int register(){
int res = 0;
SqlSession sqlSession = BaseMapperTest.getSqlSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUserName(userName);
user.setUserPassword(userPassword);
user.setCreateTime(new Date());
//将新建的对象插入数据库中,返回值result 是执行的SQL影响的行数
res = userMapper.insert(user);
} catch(Exception e){
res = -1;
e.printStackTrace();
} finally{
sqlSession.commit(); //提交操作结果
sqlSession.close(); //关闭链接
}
return res;
}
}
此处应该将SqlSession 及响应的操作封装到DAO层,以便更好的体现出MVC的优势。但是作为一个Javaweb示例程序,没有那么严谨,真正的项目应对Dao层及Service层有明确的界限。
首先需要有一个JSP页面,项目中的页面都属于View层。如下,是登录页面:
<%@ page isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
智 能 仪 表 设 备 管 理
登 录
账号或密码错误!
注册页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
智 能 仪 表 设 备 管 理
注 册
/**
* 创建一个简单的Servlet类
*/
public class LoginServlet extends HttpServlet {
/**
* post请求
* @param request
* @param response
* @throws IOException
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PrintWriter out=response.getWriter();
//获取请求携带的参数
String userName = request.getParameter("name");
String userPassword = request.getParameter("pwd");
LoginUser loginUser = new LoginUser(userName,userPassword);
User user = loginUser.login();
if(user!=null){
//登录成功
request.getSession().setAttribute("user",user); //设置会话属性,会话属性与请求属性的主要区别在范围
// request.setAttribute("message", "欢迎用户"+userName); //向request域中放置信息
// request.getRequestDispatcher("/main.jsp").forward(request, response);//转发到成功页面
response.setContentType("text/html");
response.sendRedirect("main.jsp");
}else{
//验证失败
request.setAttribute("message", "用户名或密码错误,请重试!"); //向request域中放置信息
request.getRequestDispatcher("/index.jsp").forward(request, response);//转发到成功页面
}
}
}
/**
* 注册页面的servlet
*/
public class RegisterServlet extends HttpServlet {
/**
* post请求
* @param request
* @param response
* @throws IOException
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
//获取jsp页面传递到服务器的参数
String userName = request.getParameter("name");
String usePassword = request.getParameter("pwd");
RegistUser registUser = new RegistUser(userName,usePassword);
if(registUser.register()>0){
//注册成功
request.getRequestDispatcher("/index.jsp").forward(request,response);
}else{
//注册失败
request.setAttribute("message","注册失败");
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
}
}
为了对登录进行检查,我们使用Filter过滤器,对所有请求进行检查,以判断是否登录。
/**
* 登录检查
*/
public class LoginCheckFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取资源请求路径
String uri = request.getRequestURI();
String[] loginUri = {"/index.jsp","/register.jsp","/login.do","/register.do","/"};
//判断是否包含登录相关请求
for(String path:loginUri){
if (uri.endsWith(path)) {
filterChain.doFilter(request,response);
return;
}
}
//请求的url不在特定uri之内
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
response.setContentType("text/html");
response.sendRedirect("index.jsp");
}else{
filterChain.doFilter(request,response);
}
}
@Override
public void destroy() {
//销毁
}
}
Filter过滤器有很多应用,如下所示,对编码进行设置:
public class EncodingFilter implements Filter {
private String encoding = "UTF-8"; // 默认编码UTF-8
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 如果用户配置了编码,则将encoding设置为用户编码
if(filterConfig.getInitParameter("ENCODING")!=null){
encoding = filterConfig.getInitParameter("ENCODING");
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 设置请求与响应的编码
servletRequest.setCharacterEncoding(encoding);
servletResponse.setCharacterEncoding(encoding);
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
encoding = null;
}
}
Archetype Created Web Application
config
mybatis-config.xml
Encoding
com.wyf.filter.EncodingFilter
ENCODING
UTF-8
LoginCheck
com.wyf.filter.LoginCheckFilter
Encoding
/*
LoginCheck
/*
com.wyf.listener.MyServletContextListener
login
com.wyf.servlet.LoginServlet
register
com.wyf.servlet.RegisterServlet
login
/login.do
register
/register.do
本文主要以一个登录注册操作,对Javaweb的基础内容,servlet、jsp、session、listener、Filter以及MVC结构进行简单的总结。
项目源码:https://download.csdn.net/download/sssxlxwbwz/85064123