开头,首先想记录下一首诗,是今天拇指阅读看到的;很有感触,所以乐于分享;


那么,下面正式开始进入正题,搭建一个 SSH完整的项目;

首先,我们需要在WEB-ROOT下创建一个login.jsp(登录)页面;

在body之中填写如下代码:

<form action="user.action" method="post">
<!-- Struts返回页面对象需要加前缀 user.name -->
用户名:<input type="text" name="user.name" value="${requestScope.user.name} " />
密码:<input type="password" name="user.pwd" />
<input type="submit" value="登录" />
</form>
<!-- 错误:返回该页面时显示的数据 -->
${error }

然后,我们在WebRoot新建一个success.jsp;登录成功页面;验证登录成功跳转;

在body之中编写代码:

恭喜你,登录成功!!!${sessionScopr.user.name }

因为登录时需要访问action,需要创建action,在创建action之前,新建一个实体类;

新建一个实体类User;它必须和数据库对应的表保持一致;



源码:

package com.jredu.entity;

public class User {

    private int id;
private String name;
private String pwd; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} }

因为使用的Hibernate框架,所以创建一个实体类的映射文件;同User实体类在同包下;(User.hbm.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- package对应实体类的包 -->
<hibernate-mapping>
<!-- 对应的实体类,domain对象,pojo -->
<class name="com.jredu.entity.User" table="users">
<id name="id" column="id" type="java.lang.Integer">
<!-- 主键生成策略 -->
<!-- 序列的形式生成主键 -->
<generator class="sequence">
<!-- 指定参数:指定序列的名称 -->
<param name="sequence">USERS_SEQ</param>
</generator>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="pwd" column="pwd" type="java.lang.String"/>
</class>
<query name="findUser">
<![CDATA[
from User where name=:name and pwd=:pwd
]]>
</query>
</hibernate-mapping>

跳转action,创建Action;(UserAction.java)该类继承 extends ActionSupport;



- 重写execute()方法;验证登录:(登录成功,登录失败)

源码:

package com.jredu.action;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.jredu.entity.User;
import com.jredu.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport{ private User user;
private String error; //给前台返回的错误信息 @Autowired
private UserService service; @Override
public String execute() throws Exception {
// TODO Auto-generated method stub
//验证登录
User realUser = service.getUser(user);
if(realUser!=null){
//登录成功
//存储到Session中
Map<String, Object> map=ActionContext.getContext().getSession();//拿到Session
map.put("user", realUser);
return SUCCESS;
}else{
//登录失败
setError("用户名或密码错误");
return INPUT;
}
} public String getError() {
return error;
} public void setError(String error) {
this.error = error;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
}

因为Action验证登录的判断需要下层的支持;所以:

在application-Context.xml中配置Action;


因为需要被实例化(2种方式,1种添加注解的方式,另一种配置文件,添加bean);

我们采用第二种方式来实例化;


依然需要配置,在Struts中继续配置;在package中进行配置;


Action层配置完毕,进入下一层,Service层;

创建UserService接口;创建一个方法;


创建UserService接口的实现类;实现UserService接口中的方法;



源码:

package com.jredu.serviceimpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.jredu.dao.UserDao;
import com.jredu.entity.User;
import com.jredu.service.UserService; @Service
public class UserServiceImpl implements UserService{ @Autowired
private UserDao dao; @Override
public User getUser(User user) {
// TODO Auto-generated method stub
return dao.findUser(user);
} }

然后进入下一层;创建Dao层;UserDao的接口类;


创建UserDaoImpl实现UserDao;



源码:

package com.jredu.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import com.jredu.dao.UserDao;
import com.jredu.entity.User; //将Dao层变成对象
@Repository
public class UserDaoImpl implements UserDao{ @Autowired
private SessionFactory factory; @Override
public User findUser(User user) {
// TODO Auto-generated method stub
Session session = factory.openSession();
//传一个方法的名字
Query query = session.getNamedQuery("findUser");
//传参
query.setString("name", user.getName());
query.setString("pwd", user.getPwd());
List<User> list = query.list();
if(list!=null&&!list.isEmpty()){
return list.get(0);
}
return null;
} }

下一步;Hibernate方法,查数据库;

查询数据库,首先要连接;我们在Spring配置文件中配置过sessionFactory;我们可以直接将其使用,可以在实现类中定义sessionFactory;


返回上一层


Action调用,返回Action;

注入UserService;




至此,项目搭建完成;经测试可以正常运行;SSH的搭建请参考上一篇博客;

SSH入门开发(实现一个简单的登录功能)详解的更多相关文章

  1. Asp.NetMVC利用LigerUI搭建一个简单的后台管理详解(函登录验证)

    上一篇 Asp.Net 中Grid详解两种方法使用LigerUI加载数据库数据填充数据分页  了解了LigerUI 中Grid的基本用法  现在结合上一篇的内容做一个简单的后台管理,当然也有前台的页面 ...

  2. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  3. 【转载】Ssh整合开发介绍和简单的登入案例实现

    Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一  介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...

  4. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

  5. SCP免密传输和SSH登录流程详解

    SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu.树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的s ...

  6. spring Boot 简单的登录功能,利用了jdbcTemplate.class完成sql语句的执行,无需service层、dao层和.xml文件

    1.搭建SpringBoot项目首先我们先在IDEA上创建一个SpringBoot的Web项目(1)file ——> new ——> project——> Spring Initia ...

  7. Linux实现利用SSH远程登录服务器详解

    Linux实现利用SSH远程登录服务器详解 http://www.111cn.net/sys/linux/55152.htm

  8. JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  9. SSH隧道:端口转发功能详解

    SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 1.1 ssh安全隧道(一):本地端口转发 如下图,假如host3和host ...

随机推荐

  1. hadoop伪分布式平台组件搭建

    第一部分:系统基础配置 系统基础配置中主完成了安装大数据环境之前的基础配置,如防火墙配置和安装MySQL.JDK安装等 第一步:关闭防火墙 Hadoop与其他组件的服务需要通过端口进行通信,防火墙的存 ...

  2. Win Task 任务管理器 批量杀进程方法

    Example Kill All Chrome & Chrome Driver taskkill /IM chromedriver.exe /F taskkill /IM chrome.exe ...

  3. 使用GitHub Actions自动编译部署hexo博客

    前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...

  4. 想学Python不知如何入门,教你!

    一.入门引导   想必有很多小伙伴想学习Python,又不知道如何入门,总觉得学习一定要头悬梁,锥刺股!NO,今天给大家分享下如何轻松入门Python!   首先,我们要学习Python,那一定要和你 ...

  5. 大厂面试官竟然这么爱问Kafka,一连八个Kafka问题把我问蒙了?

    本文首发于公众号:五分钟学大数据 在面试的时候,发现很多面试官特别爱问Kafka相关的问题,这也不难理解,谁让Kafka是大数据领域中消息队列的唯一王者,单机十万级别的吞吐量,毫秒级别的延迟,这种天生 ...

  6. SpringBoot魔法堂:@MatrixVariable参数注解使用详解

    前言 RFC3986定义URI的路径(Path)中可包含name-value片段,扩充了以往仅能通过查询字符串(Query String)设置可选参数的囧境. 假如现在需要设计一个用于"搜索 ...

  7. Docker学习笔记之向服务器部署应用程序

    部署的应用仅仅是简单应用程序,使用的是node管理的web应用,具体我也不是很会,当然也可以配置tomcat服务器.这里主要是学习docker.需要客户机和服务机,其中服务机必须要为Linux操作系统 ...

  8. Mac pycharm更换版本后打不开

    1.第一步:先输入:   cd /Applications/PyCharm.app/Contents/MacOS 2.第二步:查看无法打开pycharm的原因,需要输入:c./pycharm 3.第三 ...

  9. Mybatis 报错java.sql.SQLException: No suitable driver found for http://www.example.com

    运行项目报错 Error querying database. Cause: java.sql.SQLException: No suitable driver found for http://ww ...

  10. MySQL select 语句指定字段查询

    指定字段查询 SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as al ...