用Spring开发JavaWeb应用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 乘风1/3——实现用户登录的要求描述,分析,知识点,实操。

本特利的学习笔记

2-11.jpg

实现用户登录

1.要求

用Spring框架创建一个基于MVC模式的Web应用实现用户登录验证。

具体要求:

  • 用Spring JDBC实现和数据库的访问;
  • 用Spring MVC实现控制器,接收用户在页面输入的用户名和密码;
  • 用Spring的IoC和AOP实现权限检查和日志记录;

2-11.jpg

2.分析

实现上述任务会涉及到的页面、接口和类如下:

login.jsp: 提供输入用户名和密码的界面

UserController.java:接收用户的请求(用户名、密码),根据用户请求调用UserService中的方法;

UserService接口和UserServiceImpl类;

UserDAO接口和UserDAOImpl类:利用Spring JDBC实现用户登录验证

2-11.jpg

3.知识点

1.Spring MVC前端控制器

SpringMVC是Spring框架的一部分,采用MVC设计模式的一个轻量级Web框架,优点比较多,控制器不用继承任何父类或者实现任何接口,提供了一个前端控制器DispatcherServlet,由HttpServlet派生的来。和其他Servlet一样,需要在web.xml中配置。

具体配置代码如下:

  1. ContextLoaderListener
    ContextLoaderListener的作用:启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生WebApplicationContext对象,然后将这个对象放置在ServletContext的属性里,这样我们只要得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。

3.视图解析器

Spring MVC中的视图解析器负责解析视图,配置视图解析器时,可以指定前缀和后缀。如下图所示:

4.控制器类

控制器主要完成:

  1. 用于接收用户的请求;
  2. 根据用户请求调用Model层的方法;
  3. 根据方法的返回值,跳转页面;

2-11.jpg

4.实操

第一步:新建一个Java Web项目,导入以下Jar包:

第二步:在web.xml中配置:

1.配置加载的Spring配置文件的路径和文件

2.配置ContextLoaderListener

<!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

3.配置前端控制器

4.配置字符编码过滤器

第三步:编写DAO层接口和类

1.编写UserDao接口

/**
 * 
 * @author Administrator
 *
 */
public interface UserDao {
    /**
     * 用户登录方法
     * @param name  用户名
     * @param pwd   密码
     * @return   true 代表登录成功   false代表登录失败
     */
    public boolean doLogin(final String name,final String pwd);
}

2.实现类UserDaoImpl

/**
 * UserDaoImpl实现UserDao接口, 通过JdbcTemplate实现对用户修改密码
 * 
 * @author Administrator
 * 
 */
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Autowired
    JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    @Override
    public boolean doLogin(final String name,final String pwd) {
         String sql="select * from users where loginId=? and loginPwd=?";
         RowMapper<Users> rowMapper=new
         BeanPropertyRowMapper<Users>(Users.class);
         Object []args=new Object[]{name,pwd};
         try {
         jdbcTemplate.queryForObject(sql, args, rowMapper);
         } catch (DataAccessException e) {
         System.out.println("用户名或者密码不正确");
         return false;
         }
         return true;   
    }
  }
}

第四步:编写Service接口和类

1.编写UserService接口

public interface UserService {
    /**
     * 用户登录方法
     * @param name  用户名
     * @param pwd   密码
     * @return   true 代表登录成功   false代表登录失败
     */
    public boolean  doLogin(String name,String pwd);
}

2.实现类UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    @Qualifier("userDao")
    UserDao  userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public boolean doLogin(String name, String pwd) {
        // TODO Auto-generated method stub
        return userDao.doLogin(name, pwd);
    }
}

3.编写切面类

/**
 * 切面类,实现用户权限检查和日志记录
 * @author Administrator
 *
 */
@Aspect
@Component
public class MyAspect {
    @Pointcut("execution(* com.chap52.service.impl.*.*(..))")
    private void myPointCut(){}
    /**
     * 用户权限检查
     */
    @Before("myPointCut()")
    public void checkPermission(){
        System.out.println("模拟用户权限检查");
    }
    /**
     * 模拟日志记录
     */
    @AfterReturning("myPointCut()")
    public void log(){
        System.out.println("模拟日志记录");
    }
}

第五步:编写Controller

1.编写控制器类,不用继承任何类或者实现任何接口。

@Controller
public class UserController {
    @Autowired
    UserService userService;
    @RequestMapping("login")
    public String doLogin(Users user) {
        if(userService.doLogin(user.getLoginId(), user.getLoginPwd())){
            return "index";
        }
        else{
            return "login";
        }
    }
}

2.编写Users类,属性和数据库中字段类型和字段名一致,首字母小写,采用驼峰命名规则。

/**
 * POJO类,和数据库中的users表一致
 * @author Administrator
 *
 */
public class Users {
    private int id;
    private String loginId;
    private String loginPwd;
    private String name;
    private String address;
    private String phone;
    private String mail;
    private int userRoleId;
    private int userStateId;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getLoginId() {
        return loginId;
    }
    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }
    public String getLoginPwd() {
        return loginPwd;
    }
    public void setLoginPwd(String loginPwd) {
        this.loginPwd = loginPwd;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getMail() {
        return mail;
    }
    public void setMail(String mail) {
        this.mail = mail;
    }
    public int getUserRoleId() {
        return userRoleId;
    }
    public void setUserRoleId(int userRoleId) {
        this.userRoleId = userRoleId;
    }
    public int getUserStateId() {
        return userStateId;
    }
    public void setUserStateId(int userStateId) {
        this.userStateId = userStateId;
    }
    @Override
    public String toString() {
        return "Users [id=" + id + ", loginId=" + loginId + ", loginPwd="
                + loginPwd + ", name=" + name + ", address=" + address
                + ", phone=" + phone + ", mail=" + mail + ", userRoleId="
                + userRoleId + ", userStateId=" + userStateId + "]";
    }
}

第六步:编写JSP页面

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <form  action="login"  method="post">
     用户名:<input type="text"  name="loginId"/><br>
     密码:<input type="password" name="loginPwd"/><br>
     <input type="submit"  value="登录"/>
  </form>
</body>
</html>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  你好,登录成功!
</body>
</html>

第七步:编写SpringJDBC配置文件、Spring配置文件和SpringMVC配置文件

1.SpringJDBC配置文件

在src文件夹下,新建database.xml,配置数据源和jdbcTemplate,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<beans  xmlns="http://www.springframework.org/schema/beans" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:tx="http://www.springframework.org/schema/tx"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-4.3.xsd 
        http://www.springframework.org/schema/aop  
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd  
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
        <!-- 配置数据源 -->
        <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/mybookshop" />
            <property name="username" value="ruanjian18" />
            <property name="password" value="123456" />
        </bean>
        <!-- 配置JdbcTemplate -->
        <bean id="jdbcTemplate"  class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="datasource" />
        </bean>
        <!-- 配置事务管理器 -->
        <bean  id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="datasource" />
        </bean>
        <!-- 启用事务管理注解 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        <!-- 配置事务增强 -->
        <tx:advice id="txAdvie" transaction-manager="transactionManager">
              <tx:attributes>
                  <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
              </tx:attributes>
        </tx:advice>
        <!-- 用声明式AspectJ-->
        <aop:config>
            <aop:pointcut expression="execution(* com.chap501.dao.impl.*.*(..))" id="txPointCut"/>
            <aop:advisor advice-ref="txAdvie" pointcut-ref="txPointCut"/>
        </aop:config> 
</beans>

2.Spring配置文件

在src文件夹下,新建applicationContext.xml配置文件,启动注解方式加载Bean,启用注解的声明式Aspect J和导入SpringJDBC的配置文件database.xml。代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<beans  xmlns="http://www.springframework.org/schema/beans" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-4.3.xsd  
        http://www.springframework.org/schema/aop  
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
       <!-- 导入一个配置文件 -->
       <import resource="classpath*:/database.xml"/>
       <!--  启动注解  -->
       <context:component-scan base-package="com.chap52.**" />
       <!-- 启动AOP注解 -->
       <aop:aspectj-autoproxy />
</beans>

3.SpringMVC配置文件

在src文件夹下,新建springmvc-config.xml配置文件,配置用注解的方式扫描Controller和配置视图解析器,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-4.3.xsd ">
   <!-- 配置用户定义的Controller的实例 -->
   <context:component-scan base-package="com.chap52.controller" />
   <!-- 配置视图解析器 -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
           <!-- 指定前缀 -->
           <property name="prefix" value="/" />
           <!-- 指定后缀 -->
           <property name="suffix" value=".jsp" />
   </bean>
</beans>

第八步:运行,查看结果

选中login.jsp,右键“Run as”->"Run on Server"查看运行结果。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
安全 Java 网络安全
当网络安全成为数字生活的守护者:Spring Security,为您的应用筑起坚不可摧的防线
【9月更文挑战第2天】在数字化时代,网络安全至关重要。本文通过在线银行应用案例,详细介绍了Spring Security这一Java核心安全框架的核心功能及其配置方法。从身份验证、授权控制到防御常见攻击,Spring Security提供了全面的解决方案,确保应用安全。通过示例代码展示了如何配置`WebSecurityConfigurerAdapter`及`HttpSecurity`,帮助开发者有效保护应用免受安全威胁。
54 4
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
9天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
527 8
|
7天前
|
Java 对象存储 开发者
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
23 3
|
14天前
|
Kubernetes Cloud Native Java
当 Quarkus 遇上 Spring Boot,谁才是现代云原生应用的终极之选?究竟哪款能助你的应用傲视群雄?
Quarkus 和 Spring Boot 均为构建现代云原生应用的热门框架,旨在简化开发流程并提升性能。Spring Boot 依托庞大的 Spring 生态系统,提供开箱即用的体验,适合快速搭建应用。Quarkus 由红帽发起,专为 GraalVM 和 HotSpot 设计,强调性能优化和资源消耗最小化,是云原生环境的理想选择。
15 3
|
20天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
20天前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
28天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
|
29天前
|
NoSQL 前端开发 Java
使用 Spring Boot + Neo4j 实现知识图谱功能开发
在数据驱动的时代,知识图谱作为一种强大的信息组织方式,正逐渐在各个领域展现出其独特的价值。本文将围绕使用Spring Boot结合Neo4j图数据库来实现知识图谱功能开发的技术细节进行分享,帮助读者理解并掌握这一技术栈在实际项目中的应用。
100 4
|
1月前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
86 5
下一篇
无影云桌面