在完成了ssh框架搭建的基础上,我尝试着去了解更多。新一阶段还是一些简单的增删改查,只是提高自己的熟练度。

这一片我要创建一个登录页面,并查询数据库完成登录。

一、创建实体:

1、1新建职员实体employee:

package com.ssh.entity;

import java.util.Date;

public class Employee {

	private int employee_id;
private String username;
private String password;
private String sex;
private String positioin;
private int phone;
private Date birthday; //所属部门
private Department department; public int getEmployee_id() {
return employee_id;
} public void setEmployee_id(int employeeId) {
employee_id = employeeId;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getPositioin() {
return positioin;
} public void setPositioin(String positioin) {
this.positioin = positioin;
} public int getPhone() {
return phone;
} public void setPhone(int phone) {
this.phone = phone;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Department getDepartment() {
return department;
} public void setDepartment(Department department) {
this.department = department;
} }

1、2创建部门实体department:

package com.ssh.entity;

import java.util.HashSet;
import java.util.Set; public class Department { private int department_id;
private String department_name;
private String department_parent_id; //部门员工集合(hibernate有单向关联,这里用双向关联)
private Set<Employee> employees = new HashSet<Employee>(); public int getDepartment_id() {
return department_id;
}
public void setDepartment_id(int departmentId) {
department_id = departmentId;
}
public String getDepartment_name() {
return department_name;
}
public void setDepartment_name(String departmentName) {
department_name = departmentName;
}
public String getDepartment_parent_id() {
return department_parent_id;
}
public void setDepartment_parent_id(String departmentParentId) {
department_parent_id = departmentParentId;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
} }

二、实体映射文件:

2、1employee的映射文件employee.hbm.xml:

(注意职员表和部门表的对应关系多对一)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.ssh.entity.Employee" table="employee">
<id name="employee_id" column="employee_id">
<generator class="native"></generator>
</id> <property name="username" column="username" length="20"></property>
<property name="password" column="password" length="20"></property>
<property name="sex" column="sex" length="2"></property>
<property name="positioin" column="positioin" length="20"></property>
<property name="phone" column="phone" length="20"></property>
<property name="birthday" column="birthday" ></property> <!-- 配置关联关系,员工对部门是多对一,这里生成的也是数据库表的外键。 -->
<many-to-one name="department" class="com.ssh.entity.Department" column="depart_id"/>
</class>
</hibernate-mapping>

2、2department实体映射文件:department.hmb.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.ssh.entity.Department" table="department">
<id name ="department_id" column="department_id">
<generator class="native"></generator>
</id> <property name="department_name" column="department_name" length="20"></property>
<property name="department_parent_id" column="department_parent_id" length="50"></property> <!-- 配置关联关系 -->
<set name="employees">
<key column="depart_id"></key>
<one-to-many class="com.ssh.entity.Employee"/>
</set>
</class> </hibernate-mapping>

3、3在applicationcontext.xml→sessionFactory→mappingResources引入hibernate映射文件:

        	<property name="mappingResources">
<list>
<!-- 映射文件全路径 -->
<value>com/ssh/entity/product.hbm.xml</value>
<value>com/ssh/entity/Department.hbm.xml</value>
<value>com/ssh/entity/Employee.hbm.xml</value> </list>
</property>

运行项目,让ssh为你在数据库去创建你要的employee、department表。

三、新建登录页面

就在index.xml基础上修改吧。

这里有一个struts2的标签可以学习下:<h1><s:actionerror/></h1>他可以将后台的错误提示信息自动显示。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!-- struts2 标签库 -->
<%@taglib uri ="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>登录页面</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<div align="center">
<h1><s:actionerror/></h1>
<h1>欢迎</h1>
<s:form action="door_login" method="post" namespace="/" theme="simple">
<table border="1" width="400">
<tr>
<td>用户名:</td>
<td><s:textfield name="username"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><s:textfield name="password"/></td>
</tr>
<tr>
<!-- colspan: 合并单元格-->
<td align="center" colspan="2"><input type="submit" value="登录"> </td>
</tr>
</table>
</s:form>
</div>
</body>
</html>

四、控制层、业务层、持久层登录方法的实现:

employeeAction:使用模型驱动ModelDriven接收前端数据

这里面有一个addActionError的方法,就是将错误提示信息返回给前端页面。

package com.ssh.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.ssh.entity.Employee;
import com.ssh.service.employeeService; public class employeeAction extends ActionSupport implements ModelDriven<Employee> {
private Employee employee = new Employee();
//使用模型驱动接收前段页面数据,并将获取数据封装到employee对象。
public Employee getModel() {
// TODO Auto-generated method stub
return employee;
} //注入业务层类
private employeeService employeeService;
public void setEmployeeService(employeeService employeeService) {
this.employeeService = employeeService;
} public String login(){
Employee existEmployee = employeeService.login(employee);
Date date = new Date();
if (existEmployee != null) {
System.out.println("acction"+existEmployee);
//登陆成功,提示登录成功!把登录信息存入session
this.addActionMessage(existEmployee.getUsername()+"登录成功!"+"\t"+date);
ActionContext.getContext().getSession().put("existEmployee", employee);
return SUCCESS;
}else {
//登录失败,提示错误信息,返回登录界面。
this.addActionError("用户名或密码错误!");
return INPUT;
}
//return NONE;
} }

employeeService:

public interface employeeService {

	Employee login(Employee employee);

}

实现类employeeServiceImpl:

public class employeeServiceImpl implements employeeService {
private employeeDao employeeDao;
//注入dao
public void setEmployeeDao(employeeDao employeeDao) {
this.employeeDao = employeeDao;
} public Employee login(Employee employee) {
Employee existEmployee = employeeDao.findUsernameAndPassword(employee);
return existEmployee;
} }

employeeDao:

public interface employeeDao {

	Employee findUsernameAndPassword(Employee employee);

}

实现类employeeDaoImpl:注意继承hibernate模板

public class employeeDaoImpl extends HibernateDaoSupport implements employeeDao {

	public Employee findUsernameAndPassword(Employee employee) {
String hql ="from Employee where username = ? and password = ?";
List<Employee> list =this.getHibernateTemplate().find(hql, employee.getUsername(),employee.getPassword());
if (!list.isEmpty()) {
System.out.println("dao:"+list.get(0));
return list.get(0);
}
return null;
} }

五、配置applicationcontext.xml以及struts.xml:

5、1控制层、业务层、持久层的注入配置:

		<bean id="employeeAction" class="com.ssh.action.employeeAction" scope="prototype">
<!-- 需要手动注入service -->
<property name="employeeService" ref="employeeService"></property>
</bean> <!-- 配置业务层的类 -->
<bean id="employeeService" class="com.ssh.service.impl.employeeServiceImpl">
<property name="employeeDao" ref="employeeDao"></property>
</bean> <!-- 配置dao层:注入hibernate模板 -->
<bean id="employeeDao" class="com.ssh.dao.impl.employeeDaoImpl">
<!-- ref 值与sessionFactory bean id保持一致 -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

5.2struts.xml的action配置:

注意这里配置的两个返回结果标签result,成功的跳转addproduct。jsp,失败的返回登录页。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />   <package name="default" namespace="/" extends="struts-default">
<action name="door_*" class="employeeAction" method="{1}">
<result name="success">/addproduct.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package> </struts>

六、运行项目

成功跳转:

SSH(七)新的开始的更多相关文章

  1. debian 安裝SSH 增加新用戶 并使用sudo

    1 新建新用戶user 2 3 adduser user 4 5 passwd 123654 6 7 exit 刚安装好的Debian默认还没有sudo功能. 1.安装sudo # apt-get i ...

  2. SSH框架新线程下执行数据库持久化时 No Session found for current thread

    架构:SSH框架 问题:多线程下的持久化操作 异常No Session found for current thread出现环境: SSH框架,采用声明式事务, 通过sessionFactory.ge ...

  3. JAVA 8 主要新特性 ----------------(七)新时间日期 API ----- Duration “时间”间隔

    Duration:用于计算两个“时间”间隔 简介: 用法: 1.Zero常量 实例: Duration duration = Duration.ZERO; System.out.println(&qu ...

  4. JAVA 8 主要新特性 ----------------(七)新时间日期 API -----Instant 时间戳

    一.简介 用于“时间戳”的运算.它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经历的描述进行运算 二.文档介绍 1.now Instant instantNow = ...

  5. JAVA 8 主要新特性 ----------------(七)新时间日期 API -----LocalDateTime

    一.LocalDateTime简介 二.实战讲解 LocalDateTime localDateMax = LocalDateTime.MAX; System.out.println("lo ...

  6. JAVA 8 主要新特性 ----------------(七)新时间日期 API -----LocalDate

    一.改版原因 1.老板的Date和Calander存在问题,日期操作名称混乱,有的在text下,有的在util下,包名混乱         2.Simple包混乱,致命错误线程不安全.        ...

  7. Github授权新的设备ssh接入

    为Mac生成公钥 步骤: 检查本机是否已有公钥 ls -la ~/.ssh 将原来的公钥删除 rm -rf ~/.ssh 生成新的公钥(填自己的邮箱),然后除了密码,一路默认 ssh-keygen - ...

  8. DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

    设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...

  9. RHEL7 修改SSH默认端口及修改SELinux运行状态

    RHEL7安装后,默认开启SSH服务以便远程配置,但默认端口22并不安全,一般不建议使用默认端口,那就修改SSH默认端口.在sshd_config里面的修改RHEL7.0上修改和7.0以下类似,但要注 ...

  10. 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

    设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...

随机推荐

  1. Python中的super函数,你熟吗?

    摘要:经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? 本文分享自华为云社区<Python中的super函数怎么学,怎么解 ...

  2. haodoop概念总结

    大数据部门组织结构 Hadoop的优势(4高) 高可靠性:Hadoop底层维护多个数据副本 高扩展性:在集群间分配任务数据,可方便的扩展 高效性:在MapReduce的思想下,Hadoop时并行工作的 ...

  3. CentOS7使用tar方式安装Containerd,配置文件介绍

    主机:centos 7.9 下载 官网GitHub上下载地址:https://github.com/containerd/containerd/releases 问题: 创建容器后,运行的时候报错: ...

  4. nginx配置文件安全设置--重要

    防止Nginx头部攻击漏洞和恶意域名解析漏洞 在nginx主配置文件中,写第一个server,server_name用默认default_server,让所有未匹配的server_name,都走这个s ...

  5. 使用nginx部署Django静态文件配置

    首先,我们配置静态文件,要在setting.py里面加入如下几行代码: # settings.py # the settings above # STATIC SETTINGS STATIC_URL ...

  6. Python中dataclass库

    目录 dataclass语法 一. 简介 二. 装饰器参数 三. 数据属性 1. 参数 2. 使用示例 3. 注意事项 四. 其他 1. 常用函数 2. 继承 3. 总结 dataclass语法 一. ...

  7. 谣言检测——(PSA)《Probing Spurious Correlations in Popular Event-Based Rumor Detection Benchmarks》

    论文信息 论文标题:Probing Spurious Correlations in Popular Event-Based Rumor Detection Benchmarks论文作者:Jiayin ...

  8. 2022.9.17 Java第二次课总结

    以下是本节课后的问题 首先是关于静态变量 在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个 ...

  9. 华为交换机STP常用命令

    STP配置和选路规则 stp enable 在交换机上启用STP stp mode stp dis stp 查看stp配置 dis stp brief 查看接口摘要信息 stp priority 40 ...

  10. MybatisPlus生成主键策略方法

    MybatisPlus生成主键策略方法 全局id生成策略[因为是全局id所以不推荐] SpringBoot集成Mybatis-Plus 在yaml配置文件中添加MP配置 mybatis-plus: g ...