SSH(七)新的开始
在完成了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(七)新的开始的更多相关文章
- debian 安裝SSH 增加新用戶 并使用sudo
1 新建新用戶user 2 3 adduser user 4 5 passwd 123654 6 7 exit 刚安装好的Debian默认还没有sudo功能. 1.安装sudo # apt-get i ...
- SSH框架新线程下执行数据库持久化时 No Session found for current thread
架构:SSH框架 问题:多线程下的持久化操作 异常No Session found for current thread出现环境: SSH框架,采用声明式事务, 通过sessionFactory.ge ...
- JAVA 8 主要新特性 ----------------(七)新时间日期 API ----- Duration “时间”间隔
Duration:用于计算两个“时间”间隔 简介: 用法: 1.Zero常量 实例: Duration duration = Duration.ZERO; System.out.println(&qu ...
- JAVA 8 主要新特性 ----------------(七)新时间日期 API -----Instant 时间戳
一.简介 用于“时间戳”的运算.它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经历的描述进行运算 二.文档介绍 1.now Instant instantNow = ...
- JAVA 8 主要新特性 ----------------(七)新时间日期 API -----LocalDateTime
一.LocalDateTime简介 二.实战讲解 LocalDateTime localDateMax = LocalDateTime.MAX; System.out.println("lo ...
- JAVA 8 主要新特性 ----------------(七)新时间日期 API -----LocalDate
一.改版原因 1.老板的Date和Calander存在问题,日期操作名称混乱,有的在text下,有的在util下,包名混乱 2.Simple包混乱,致命错误线程不安全. ...
- Github授权新的设备ssh接入
为Mac生成公钥 步骤: 检查本机是否已有公钥 ls -la ~/.ssh 将原来的公钥删除 rm -rf ~/.ssh 生成新的公钥(填自己的邮箱),然后除了密码,一路默认 ssh-keygen - ...
- DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单
设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...
- RHEL7 修改SSH默认端口及修改SELinux运行状态
RHEL7安装后,默认开启SSH服务以便远程配置,但默认端口22并不安全,一般不建议使用默认端口,那就修改SSH默认端口.在sshd_config里面的修改RHEL7.0上修改和7.0以下类似,但要注 ...
- 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单
设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...
随机推荐
- 2022 CLion 中的Cygwin 配置(最全,最良心版)
目录 前景提要 一.windows 10 安装Cygwin 1.找到官网,进入官网,百度搜索或者点击下边链接. 2.找到如图位置,双击下载 3.下载完成后,找到下载的位置,双击exe文件. 4.进入欢 ...
- P1829 [国家集训队]Crash的数字表格
P1829 [国家集训队]Crash的数字表格 原题传送门 前置芝士 莫比乌斯反演 乘法逆元 数论分块 正文 //补充:以下式子中的除法均为整除 由题目可以得知,这道题让我们所求的数,用一个式子来表达 ...
- Kibana探索数据(Discover)
总结说明: 1.先在Management/Kibana/Index Patterns 界面下添加索引模式(前提是有索引数据) 2.在Discover界面选中响应的索引模式 3.开启Kibana 查询语 ...
- nsis插件nsisSlideshow.dll更新
更新至1.7版本,作者wiz0u已解决关于ie9的兼容问题.Good 下载地址: http://wiz0u.free.fr/prog/nsisSlideshow/latest.php
- Java程序设计(三)作业
题目1:用户输入学号,如果是以ccutsoft开头,并且后边是4位数字,前两位大于06小于等于当前年份.判断用户输入是否合法.ccutsoft_0801. 1 //题目1:用户输入学号,如果是以abc ...
- 微信小程序第三方授权登录
登录流程时序图: 1.调用uni.getProvider()获取服务供应商,参数service确定是选择对应的什么操作,此处选择授权登录oauth 代码如下: 2.调用登录接口uni.login(), ...
- 聊聊Linux中CPU上下文切换
目录 什么是CPU上下文 CPU上下文切换 上一任务的CPU上下文保存在哪? 进程上下文切换 内核空间和用户空间 top命令查看CPU资源 系统调用 进程上下文切换 和 系统调用的区别? 进程切换的常 ...
- 利用POI遍历出层级结构的excel表格
import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.util.CellRangeAddress; p ...
- 【Chrome浏览器】关闭触摸板双指滑动进行前进后退的功能
痛点 Chrome浏览器使用过程中,当前页面经常会莫名其妙地退回到上一个浏览的页面. 当时真是一脸懵B(心里一万头草泥马呼啸而过~)!以为活见鬼了! 后来才发现浏览器左边,有一个幽灵般的淡蓝色箭头的出 ...
- coding上创建项目、创建代码仓库、将IDEA中的代码提交到coding上的代码仓库、Git的下载、IDEA上配置git
文章目录 一.Git的安装以及子啊IDEA上配置Git(下载好的可以跳过) 二.怎样让IDEA和Git建立关系 三.在coding上创建项目 四.在coding上创建代码仓库 五.Git工作理论 六. ...