SSH新的开始

Posted 沙弥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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新的开始的主要内容,如果未能解决你的问题,请参考以下文章

从片段开始活动

如何修复空白片段?

在 AsyncTask 中将新的 TextView 设置为片段

从其他片段添加新的 RecyclerView 项

无法从 onListItemClick 开始片段

后按时从 onCreate() 开始片段