SSH整合之个人博客系统一对多(登录+注册(Ajax)+拦截器+分页查询+增删改)

    我做的这个小网站(个人博客系统)严格按照三层架构(Web-Service-Dao),将 Ajax应用到了注册功能中(在账号输入框失去焦点时,提示账号有没有被注册过),Struts2的自定义拦截器(用户只有登陆了,才能对博客进行增删改查)Spring中的DIAOP事务管理。所有对象都交由Spring管理HibernateTemplate操作数据库(applicationContext.xml中可以体现)。

  用户可以选择登录,可以自行注册,登陆后,可以退出登录,再登别的账号(不关闭窗口,不回退,我所用到的是在用户登录后将user存入session域,点击退出登录之后就写一个方法,将session里的user置为空,这样退出后,用户只能再次登录)。在登录之后,才能看到的自己的博客,并且每个用户只能对自己的博客进行增删改查。即User与Blog之间是一对多的关系。

至于导包什么的,参考我之前总结的:https://blog.csdn.net/zl_stepbystep/article/details/80467870



项目目录结构:

          


配置文件:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>SSH01</display-name>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	
	<!-- 让Spring容器随着Web的启动而创建的监听器 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<!-- 配置Spring配置文件位置参数 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	
	<!-- 扩大session作用范围 -->
	<!-- 注意:web.xml的执行是有顺序的。任何filter一定要在Struts的filter之前调用,因为Struts一旦进去流程,是没有放行代码的,后序的过滤器都不会被执行-->
	<filter>
		<filter-name>openSessionInView</filter-name>
		<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInView</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- Struts2核心过滤器 -->
	<filter>
		<filter-name>struts2</filter-name>
	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapmping>
		<filter-nae>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
	    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
	    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
	    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
	
	<!-- 指定Spring读取db.properties配置 -->
	<context:property-placeholder location="classpath:db.properties"/>
	<!-- 配置c3p0连接池 -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<!-- 配置核心事务管理器 -->
	<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<!-- 配置通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
	 	<tx:attributes>
	 		<!-- 以后配置大量事务时,需要使用通配符配置增删改查 -->
			<!-- 以方法为单位,指定方法应该有什么事务属性,isolation隔离级别,propagation传播行为,read-only是否只读 -->
			<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="motified*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
			<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
			<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
	 	</tx:attributes>
	</tx:advice>
	<!-- 配置将通知织入目标对象 -->
	<aop:config>
		<!-- 配置切点 -->
		<aop:pointcut expression="execution(* com.zl.service.impl.*ServiceImpl.*(..))" id="txPc"/>
		<!-- 配置切面 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
	</aop:config>
	
	<!-- 将SessionFactory配置到Spring容器中 -->
	<!-- 方案1.引入hibernate主配置文件,不推荐
	<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	</bean>-->
	<!-- 方案2  配置hibernate基本信息-->
	<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- 将连接池注入到sessionFactory中,hibernate会通过连接池 获得连接-->
		<property name="dataSource" ref="dataSource"></property>
		<property name="hibernateProperties">
			<props>
				<!-- <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
				<prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/testhibernate?useUnicode=true&characterEncoding=UTF-8</prop>
				<prop key="hibernate.connection.username">root</prop>
				<prop key="hibernate.connection.password">123456</prop>-->
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
				<!-- 上面5个必须配置,下面三个可选 -->
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
		<!-- 引入ORM元数据,指定ORM元数据所在的包路径,Spring会自动读取包中的所有配置 -->
		<property name="mappingDirectoryLocations" value="classpath:com/zl/domain"></property>
	</bean>
	
	<!-- action -->
	<!-- 注意,Action对象作用范围一定是多例的,这样才符合Struts2架构 -->
	<bean name="userAction" class="com.zl.action.UserAction" scope="prototype">
		<property name="usi" ref="usi"></property>
	</bean>
	<bean name="blogAction" class="com.zl.action.BlogAction" scope="prototype">
		<property name="bsi" ref="bsi"></property>
	</bean>
	
	<!-- service -->
	<bean name="usi" class="com.zl.service.impl.UserServiceImpl">
		<property name="ud" ref="userDao"></property>
	</bean>
	<bean name="bsi" class="com.zl.service.impl.BlogServiceImpl">
		<property name="blogDao" ref="blogDao"></property>
	</bean>
	
	<!-- dao --> 
	<bean name="userDao" class="com.zl.dao.impl.UserDaoImpl">
		<!-- 注入sessionFactory -->
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<bean name="blogDao" class="com.zl.dao.impl.BlogDaoImpl">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
</beans>

db.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///test
jdbc.user=root
jdbc.password=123456

struts.xml

<?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>
	<!-- struts.objectFactory = spring    将Action的创建交给Spring容器
		 struts.objectFactory.spring.autoWire = name   Spring负责自动装配Action依赖属性-->
	<constant name="struts.objectFactory" value="spring"></constant>
	<constant name="struts.devMode" value="true" />
	
	<package name="SHH01" namespace="/" extends="struts-default">
		
		<!-- 声明拦截器 -->
        <interceptors>
        	<interceptor name="privilege" class="com.zl.interceptor.PrivilegeInterceptor" />
        	<interceptor-stack name="myStack">
        		<interceptor-ref name="defaultStack" />
        		<interceptor-ref name="privilege"></interceptor-ref>
        	</interceptor-stack>
        </interceptors>
		
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
		
		<!-- 用户登录和注册 -->
		<action name="UserAction_*" class="userAction" method="{1}">
			<result>/index.jsp</result>
			<result name="toHome" type="redirect">/index.jsp</result>
			<result name="LOGOUT">/index.jsp</result>
			<result name="error">/login.jsp</result>
			<result name="TOREGISTER">/register.jsp</result>
			<result ></result>
		</action>
		
		<!-- 关于book操作 -->
        <action name="BlogAction_*" class="blogAction" method="{1}">
             <!-- 在Action中使用自定义拦截器 -->
             <interceptor-ref name="myStack"/>
             
             <result name="login">/login.jsp</result>
             
             <result name="toFINDALL">/findall.jsp</result>
             <result name="toADD">/add.jsp</result>
             <result name="ADD" type="redirect">BlogAction_tofindall</result>
             <result name="DELETESUCCESS" type="redirect">BlogAction_tofindall</result>
             <result name="BLOGDETAIL">/update.jsp</result>
             <result name="UPDATESUCCESS" type="redirect">BlogAction_tofindall</result>

        </action>
	</package>
	
	<!-- package里元素必须按照一定的顺序排列
		result-types 
		interceptors 
		default-interceptor-ref 
		default-action-ref 
		default-class-ref 
		global-results 
		global-exception-mappings 
		action*(就是所有的action放到最后)  
	-->
	
</struts>



src下的.java文件

1User类相关的:

User.java

package com.zl.domain;

public class User {
	private Long user_id;
	private String user_code;
	private String user_name;
	private String user_password;
	//一对多
	private Set<Blog> blogs = new HashSet<Blog>();
	
	
	public Set<Blog> getBlogs() {
		return blogs;
	}
	public void setBlogs(Set<Blog> blogs) {
		this.blogs = blogs;
	}
	
	public Long getUser_id() {
		return user_id;
	}
	public void setUser_id(Long user_id) {
		this.user_id = user_id;
	}
	public String getUser_code() {
		return user_code;
	}
	public void setUser_code(String user_code) {
		this.user_code = user_code;
	}
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public String getUser_password() {
		return user_password;
	}
	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}
	
	@Override
	public String toString() {
		return "User [user_id=" + user_id + ", user_code=" + user_code + ", user_name=" + user_name + ", user_password="
				+ user_password + "]";
	}
	
}

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">
<hibernate-mapping package="com.zl.domain" >
	<class name="User" table="sys_user" >
		<id name="user_id"  >
			<generator class="native"></generator>
		</id>
		<property name="user_code"  ></property>
		<property name="user_name"  ></property>
		<property name="user_password"  ></property>
	
		<set name="blogs">  
   			<key column="blog_user_id"></key>	
   			<one-to-many class="Blog"/>  
   		</set>
   		
	</class>
</hibernate-mapping>

UserAction.java

package com.zl.action;

public class UserAction extends ActionSupport implements ModelDriven<User>{
	private IUserService usi;
	private User user = new User();
	
	public void setUsi(IUserService usi) {
		this.usi = usi;
	}
	
	//登录
	public String login() throws Exception {
		//1.调用Service执行登录逻辑
		User u = usi.getUserByCodePassword(user);
		//2.将返回的User对象放入session域
		ActionContext.getContext().getSession().put("user", u);
		//3.重定向到项目首页
		return "toHome";
	}
	//下线
	public String logout() throws Exception {
		ActionContext.getContext().getSession().put("user", null);
		
		return "LOGOUT";
	}
	//跳转到注册页面
	public String toRegister() {
		return "TOREGISTER";
	}

	//判断是否注册过
	public String isRegistered() throws IOException {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		
		response.setContentType("text/html;charset=UTF-8");
		String user_code = request.getParameter("user_code");
		if (usi.isRegistered(user_code)) {//此user_code已经被用过了
			response.getWriter().print("true");
			System.out.println("Action true");
		} else {
			response.getWriter().print("false");
			System.out.println("Action false");
		}
		return null;
	}
	
	//注册
	public String register() {
		usi.saveUser(user);
		
		return "REGISTER";
	}
	
	@Override
	public User getModel() {
		return user;
	}
	
}
——————————————User的Service层———————————————

IUserService

package com.zl.service;

import com.zl.domain.User;

public interface IUserService {
	//登录
	User getUserByCodePassword(User u);
	User getUserByCode(String user_code);
	//注册用户
	void saveUser(User u);
	boolean isRegistered(String user_code);
}

UserServiceImpl.java

package com.zl.service.impl;

public class UserServiceImpl implements IUserService {
	private IUserDao ud;
	
	public IUserDao getUd() {
		return ud;
	}

	public void setUd(IUserDao ud) {
		this.ud = ud;
	}

	@Override
	public User getUserByCodePassword(User u) {
		//1.根据登录名称查询登录用户
		User existU = ud.getByUserCode(u.getUser_code());
		//2.判断用户是否存在,不存在=》抛出异常,提示用户名不存在
		if(existU == null) {
			throw new RuntimeException("用户不存在!");
		}
		//3.判断用户密码是否正确,不正确=》抛出异常,提示密码错误
		if(!existU.getUser_password().equals(u.getUser_password())) {
			throw new RuntimeException("用户密码错误!");
		}
		
		//4.返回查询到的用户对象
		return existU;
	}
	
	@Override
	public boolean isRegistered(String user_code) {
		boolean flag = true;  //true表示用户存在
		//1.根据登录名称查询登录用户
		User existU = ud.getByUserCode(user_code);
		//2.判断用户是否存在,不存在,返回false
		if(existU == null) {
			flag = false;
			System.out.println("用户不存在,可以注册");
		}else{
			System.out.println("用户存在,不能注册");
		}
				
		//3.返回查询到的用户对象
		return flag;
	}

	@Override
	public void saveUser(User u) {
		ud.save(u);
	}

	@Override
	public User getUserByCode(String user_code) {
		User u = ud.getByUserCode(user_code);
		return u;
	}
}

————————————————UserDAO层————————————————————

 IUserDao .java

package com.zl.dao;

public interface IUserDao {
	//根据登录名称查询User对象
	User getByUserCode(String usercode);
	void save(User u);
}

UserDaoImpl.java

package com.zl.dao.impl;

//HibernateDaoSupport为dao注入sessionFactory
public class UserDaoImpl extends HibernateDaoSupport implements IUserDao {
	
	@Override
	public User getByUserCode(final String usercode) {
		//HQL
		return getHibernateTemplate().execute(new HibernateCallback<User>() {

			@Override
			public User doInHibernate(Session session) throws HibernateException {
				String hql = "from User where user_code = ?";
				Query query = session.createQuery(hql);
				query.setParameter(0, usercode);
				User user = (User) query.uniqueResult();
				return user;
			}
			
		});
		
		//Criteria
		/*DetachedCriteria dc = DetachedCriteria.forClass(User.class);
		dc.add(Restrictions.eq("user_code", usercode));
		
		List<User> list =(List<User>)getHibernateTemplate().findByCriteria(dc);
		if(list != null && list.size()>0) {
			return list.get(0);
		}else {
			return null;
		}*/
	}

	@Override
	public void save(User u) {
		getHibernateTemplate().save(u);
		
	}
}

拦截器PrivilegeInterceptor.java

package com.zl.interceptor;

public class PrivilegeInterceptor extends AbstractInterceptor{

	private static final long serialVersionUID = 2L;
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		//得到ActionContext
		ActionContext actionContext = invocation.getInvocationContext();
		//获取user对象
		Object user = actionContext.getSession().get("user");
		if(user != null) {
			return invocation.invoke(); // 继续向下执行
		}else {
			actionContext.put("msg", "您还未登录,请先登录!");
			return Action.LOGIN; //如果用户不存在,返回login值
		}		
	}
}
(2)Blog类相关的:

Blog.java

package com.zl.domain;

public class Blog {
	private Long blog_id;
	private String blog_title;
	private String blog_label;
	private String blog_context;
	
	//多对一
	private User user;
	
	//并不与数据库表中的某个字段对应,只是为了接收表单参数
	private Long user_id;
	
	public Long getUser_id() {
		return user_id;
	}

	public void setUser_id(Long user_id) {
		this.user_id = user_id;
	}

	public User getUser() {
		return user;
	}
	
	public void setUser(User user) {
		this.user = user;
	}
	
	public Long getBlog_id() {
		return blog_id;
	}
	public void setBlog_id(Long blog_id) {
		this.blog_id = blog_id;
	}
	
	public String getBlog_title() {
		return blog_title;
	}
	public void setBlog_title(String blog_title) {
		this.blog_title = blog_title;
	}
	public String getBlog_label() {
		return blog_label;
	}
	public void setBlog_label(String blog_label) {
		this.blog_label = blog_label;
	}
	

	public String getBlog_context() {
		return blog_context;
	}
	public void setBlog_context(String blog_context) {
		this.blog_context = blog_context;
	}

	@Override
	public String toString() {
	  return "Blog [blog_id=" + blog_id + ", blog_title=" + blog_title + ", blog_label=" + blog_label
			+ ", blog_context=" + blog_context + ", user=" + user + ", user_id=" + user_id + "]\n";
	}
}

Blog.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">
<hibernate-mapping package="com.zl.domain" >
	<class name="Blog" table="sys_blog" >
		<id name="blog_id"  >
			<generator class="native"></generator>
		</id>
		<property name="blog_title"  ></property>
		<property name="blog_label"  ></property>
		<property name="blog_context"  ></property>
		
		<many-to-one name="user" column="blog_user_id" class="User" cascade="save-update"></many-to-one>
	</class>
</hibernate-mapping>


BlogAction.java 

package com.zl.action;

public class BlogAction extends ActionSupport implements ModelDriven<Blog>{
	private IBlogService bsi;
	private Blog blog = new Blog();
	private List<Blog> blogList;
	private User user;
	private int currentPage; //当前页

	//分页显示user的所有博客记录
	public String tofindall() {
		//在session域中获取user
		user = (User) ActionContext.getContext().getSession().get("user");
		if(user == null) {
			return "login";
		}
    	blogList = bsi.findall(user,currentPage);
    	
    	ActionContext.getContext().put("bar", bsi.getBar(currentPage, user));
    	return "toFINDALL";
    }
	
	public String toadd() {
    	return "toADD";
    }
	
	public String add() {
		//在session域中获取user
		user = (User) ActionContext.getContext().getSession().get("user");
	
    	bsi.add(user, blog);
    	return "ADD";
    }
    
	
    public String delete() {
    	bsi.deleteBlogById(blog.getBlog_id());
    	return "DELETESUCCESS";
    }
    
    public String detail() {
    	blog = bsi.findBlogById(blog.getBlog_id());
    	return "BLOGDETAIL";
    }
    
    public String update() {
    	System.out.println(blog);
    	user = (User) ActionContext.getContext().getSession().get("user");
    	bsi.updateBlogs(user,blog);
    	System.out.println(" "+blog);
    	return "UPDATESUCCESS";
    }


	@Override
	public Blog getModel() {
		return blog;
	}
	
	//getter setter
	public List<Blog> getBlogList() {
		return blogList;
	}

	public void setBlogList(List<Blog> blogList) {
		this.blogList = blogList;
	}

	public void setBsi(IBlogService bsi) {
		this.bsi = bsi;
	}
	
	public Blog getBlog() {
		return blog;
	}

	public void setBlog(Blog blog) {
		this.blog = blog;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
}

————————————Blog Service ————————————

IBlogService.java 

package com.zl.service;

public interface IBlogService {

	List<Blog> findall(User user,int currentPage);
	int getCount(User user);//查询某个人的博客数量
	
	void add(User user, Blog blog);
	int pageNum(User user);
	String getBar(int cpage,User user);
	void deleteBlogById(Long blog_id);
	Blog findBlogById(Long blog_id);
	void updateBlogs(User user,Blog blog);
	
}

BlogServiceImpl.java

package com.zl.service.impl;

public class BlogServiceImpl implements IBlogService {
	private IBlogDao blogDao;
	private int PAGESIZE = 3;

	public IBlogDao getBlogDao() {
		return blogDao;
	}

	public void setBlogDao(IBlogDao blogDao) {
		this.blogDao = blogDao;
	}

	//查询某个user的所有博客
	@Override
	public List<Blog> findall(User user,int currentPage) {
		List<Blog> blogList = blogDao.findallBlogs(user, currentPage,PAGESIZE);
		
		return blogList;
	}
	
	//根据查询到的user所有博客,利用List.size得到博客的总数
	@Override
	public int getCount(User user) {
		int count = blogDao.getCount(user);
		return count;
	}
	
	//根据总记录数,算出需要显示的总页数
	@Override
	public int pageNum(User user) {
		int count = getCount(user);
		return count%PAGESIZE == 0 ? count/PAGESIZE : (count/PAGESIZE+1);
	}
		
	//页面下方页码超链接
	@Override
	public String getBar(int currentPage,User user) {
		String string  = "";
		int pagenum = pageNum(user);
		for(int i=1; i<=pagenum ;i++) {
			if(i != currentPage) {
				string += "<a href='BlogAction_tofindall?currentPage="+i+"'>"+i+"</a> ";
			}else {
				string += i + " ";
			}
		}
		System.out.println(currentPage+" "+pagenum+" "+string);
		return string;
	}
	
	
	//给某个user添加博客
	@Override
	public void add(User user, Blog blog) {
		blogDao.addAblog(user,blog);
	}

	//按照id删除
	@Override
	public void deleteBlogById(Long blog_id) {
		blogDao.deleteABlog(blog_id);
		
	}

	//查找指定id的博客
	@Override
	public Blog findBlogById(Long blog_id) {
		Blog blog = blogDao.findABlog(blog_id);
		return blog;
	}

	//更新博客
	@Override
	public void updateBlogs(User user,Blog blog) {
		blogDao.updateBlog(user,blog);
	}
}

————————————BlogService————————————

IBlogDao

package com.zl.dao;


public interface IBlogDao {

	List<Blog> findallBlogs(User user,int page,int pageSize);//分页查询所有博客

	void addAblog(User user, Blog blog);

	int getCount(User user);

	void deleteABlog(Long blog_id);

	Blog findABlog(Long blog_id);

	void updateBlog(User user, Blog blog);

}

BlogDaoImpl.java

package com.zl.dao.impl;

public class BlogDaoImpl extends HibernateDaoSupport implements IBlogDao {

	@Override
	public List<Blog> findallBlogs(User user,final int currentpage,final int pageSize) {
		return getHibernateTemplate().execute(new HibernateCallback<List<Blog>>() {
			@Override
			public List<Blog> doInHibernate(Session session) throws HibernateException {
				String hql = "from Blog where user=?";
				Query query = session.createQuery(hql);
				query.setParameter(0, user);
				
				int begin = (currentpage - 1)*pageSize;
				query.setFirstResult(begin);//每一页的第一个
				query.setMaxResults(pageSize);//每页的条数
			
				
				List<Blog> blogs = query.list();
				
				return blogs;
			}
		});
		
	}

	//查询博客的总记录数
	@Override
	public int getCount(User user) {
		int count = getHibernateTemplate().execute(new HibernateCallback<List<Blog>>() {
			@Override
			public List<Blog> doInHibernate(Session session) throws HibernateException {
				String hql = "from Blog where user=?";
				Query query = session.createQuery(hql);
				query.setParameter(0, user);
				
				List<Blog> blogs = query.list();
				
				return blogs;
			}
		}).size();
		return count;
	}
	
	//给user对象添加一条博客
	@Override
	public void addAblog(User user, Blog blog) {
		blog.setUser(user); //blog与User关联
		getHibernateTemplate().save(blog);
	}

	//删除博客
	@Override
	public void deleteABlog(Long blog_id) {
		
		Blog blog = getHibernateTemplate().get(Blog.class, blog_id);
		
		getHibernateTemplate().delete(blog);
	}

	//查找博客
	@Override
	public Blog findABlog(Long blog_id) {
		Blog blog = getHibernateTemplate().get(Blog.class, blog_id);
		return blog;
	}

	//更新数据库中的博客
	@Override
	public void updateBlog(User user,Blog blog) {
//		blog.setUser(user);
		getHibernateTemplate().update(blog);
		blog.setUser(user);
	}
}

在写的过程中可以写一个专门用来测试的测试类

HibernateTest.java

package com.zl.test;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class HibernateTest {
	@Resource(name="sessionFactory")
	private SessionFactory sf;
//	@Test
	public void test02() {
		
		Session session = sf.openSession();
		Transaction tx =session.beginTransaction();
		
		User u = new User();
		u.setUser_code("hi");
		u.setUser_name("哈哎");
		u.setUser_password("12345");
		session.save(u);
		
		tx.commit();
		session.close();
	}
	
//	@Test
	public void test01() {
		Configuration conf = new Configuration().configure();
		SessionFactory sf = conf.buildSessionFactory();
		Session session = sf.openSession();
		Transaction tx =session.beginTransaction();
		
		User u = new User();
		u.setUser_code("Tomy");
		u.setUser_name("haha");
		
		session.save(u);
		tx.commit();
		session.close();
	}
	
	@Resource(name="userDao")
	private IUserDao ud;
//	@Test
	public void test03() {
		User user = ud.getByUserCode("hi");
		System.out.println(user);
	}
	
	@Resource(name="usi")
	private IUserService us;
//	@Test
	public void fun04() {
		User u = new User();
		u.setUser_code("Luna");
		u.setUser_name("露娜");
		u.setUser_password("888888");
		
		us.saveUser(u);
	}
	
	@Resource(name="bsi")
	private IBlogService bsi;
	@Test
	public void fun05() {
		User user = us.getUserByCode("Rose");
		List<Blog> blog =  bsi.findall(user, 1);
		System.out.println(blog);
//		Blog blog = new Blog();
//		blog.setBlog_title("TCP");
//		blog.setBlog_label("协议");
//		blog.setBlog_context("在不可靠的因特网上提供可靠的、端到端的字节流通信的协议");
//		
//		bsi.add(u, blog);
	}
}


JSP

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>主界面</title>
</head>
<body>
    <a href="${pageContext.request.contextPath}/BlogAction_toadd">写博客</a><br>
    <a href="${pageContext.request.contextPath}/BlogAction_tofindall">查看我的所有博客 </a><br>
</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>登录页面</title>
</head>
<body>
	<p align="center"><font color="orange"> ${requestScope.msg} </font></p>
	<br>
	<form name="form1" action="${pageContext.request.contextPath}/UserAction_login" method="post">
		<table align="center" border="0">
			<tr>
				<td>登录名:</td>
				<td><input type="text" name="user_code" value="${user_code}"></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="user_password" value="${user_password}"></td>
			</tr>
		</table>
		<p align="center">
		 	<input type="submit" value="登录">  
			<input type="reset" value="重置">  <br>
		</p>
	</form>
	
	<p align="center" ><font color="red"><s:property value="exception.message"/></font></p>
	<p align="center" ><font size="2">
		还没有账号?<a href="${pageContext.request.contextPath}/UserAction_toRegister">马上去注册</a>
	</font></p>
</body>
</html>

register.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>注册页面</title>
</head>
<script language="JavaScript">
	var xmlHttp; //Ajax核心对象
	var flag; //定义标志位
	function createXMLHttp() { //创建XMLHttpRequest核心对象
		if (window.XMLHttpRequest) { //判断当前使用浏览器的类型
			xmlHttp = new XMLHttpRequest(); //表示使用的为Firefox内核的浏览器
		} else { //表示使用的是IE内核的浏览器
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}

	function checkUserid(user_code) {
		createXMLHttp(); //建立xmlHttp核心对象
		var url = "UserAction_isRegistered?user_code=" + user_code;
		xmlHttp.open("POST", url); //初始化HTTP连接请求对象,设置请求方法,地址
		xmlHttp.onreadystatechange = checkUseridCallback; //设置请求对象状态readystate改变时要调用回调函数
		xmlHttp.send(null); //发送请求,不传递任何参数
		//document.getElementById("msg").innerHTML = "正在验证...";	   	
	}

	function checkUseridCallback() { //定义回调函数
	
		if (xmlHttp.readyState == 4) { //数据返回完毕
			if (xmlHttp.status == 200) { //HTTP操作正常
				var text = xmlHttp.responseText; //接收返回的内容
				
				if (text == "true") {//此id已经被用过了
					flag = false; //无法提交表单
					document.getElementById("msg").innerHTML = "用昵称重复,无法使用,请再次输入!";
				} else {
					flag = true; //可以提交表单
					document.getElementById("msg").innerHTML = "此昵称可以注册!";
				}

			}

		}

	}

	function checkForm() {
		return flag;
	}
</script>
<body>
	<form action="${pageContext.request.contextPath}/UserAction_register" method="post" οnsubmit="return checkForm()">
		<p id="flag"></p>
		<p>
			用户昵称:<input type="text" name="user_code" οnblur="checkUserid(this.value)" /> 
			<font id="msg" color="red"></font>
		</p>
		<p>
			密  码:<input type="password" name="user_password" />
		</p>
		<p>
			真实姓名:<input type="text" name="user_name" />
		</p>
		<p> 
			<input type="submit" value="注册" />   
			<input type="reset" value="重置" />
		</p>
	</form>

</body>
</html>

findall.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!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>showAllByPaging</title>
</head>
<body>
	<p align="right"><a href="${pageContext.request.contextPath}/UserAction_logout">退出登录</a></p>
	<h2 align="center"><font color="pink">${user.user_name}</font>的博客</h2>
	
	<table align="center" border="1" width="80%">
		<tr bgcolor="yellow">
			<th width="5%">博客ID</th>
			<th width="15%">博客标题</th>
			<th width="12%">标签</th>
			<th width="40%">博客内容</th>
			<th width="8%" colspan="2">操作</th>
		</tr>
		<s:iterator value="blogList">
		<tr>
			<td align="center">
				<s:property value="blog_id"/>
			</td>
			<td align="center">
				《<s:property value="blog_title"/>》
			</td>
			<td align="center">
				<s:property value="blog_label"/>
			</td>
			<td>
				      
				<s:property value="blog_context"/>
			</td>

			<td>
				<a href="${pageContext.request.contextPath}/BlogAction_detail?blog.blog_id=${blog_id}">修改</a>
			</td>
			<td>
				<a href="${pageContext.request.contextPath}/BlogAction_delete?blog.blog_id=${blog_id}">删除</a>
			</td>
		
		</tr>	
		</s:iterator>
	</table>
	<p align="center"><a href="${pageContext.request.contextPath}/BlogAction_toadd">再来一篇</a></p>
	<p align="center">${bar}</p>	
</body>
</html>

add.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>add</title>
</head>
<body>
    <h2 align="center">写博客</h2>
	<form action="${pageContext.request.contextPath}/BlogAction_add">
		<table align="center">
			<tr>
			    <th>博客标题:</th>
			    <td><input name="blog_title" type="text"></td>
			</tr>
			<tr>
			    <th>标签:</th>
			    <td><input name="blog_label" type="text"></td>
			</tr>
			<tr>
			    <th>博客内容:</th>
			    <td>
			    	<!-- <input name="blog_context" type="text">-->
			    	<textarea rows="5" cols="50" name="blog_context">在这里输入内容...</textarea> 
			    </td>
			</tr>
		</table>
		<p align="center">
		    <input type="submit" value="添加">   
		    <input type="reset" value="重置">
		</p>
	</form>
</body>
</html>

update.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>update</title>
</head>
<body>
	<h2 align="center">修改博客</h2>
	<form action="${pageContext.request.contextPath}/BlogAction_update" method="post">
		<table align="center">
			<tr>
			    <th>博客ID:</th>
			    <td><input name="blog.blog_id" type="text" value="${blog.blog_id}" readonly="readonly"></td>
			</tr>
			<tr>
			    <th>博客标题:</th>
			    <td><input name="blog.blog_title" type="text" value="${blog.blog_title}"></td>
			</tr>
			<tr>
			    <th>标签:</th>
			    <td><input name="blog.blog_label" type="text" value="${blog.blog_label}"></td>
			    
			</tr>
			<tr>
			    <th>博客内容:</th>
			    <td>
			    	<!-- <input name="blog.blog_context" type="text" value="${blog.blog_context}">-->
			    	<textarea rows="5" cols="50" name="blog.blog_context" >${blog.blog_context}</textarea>  
			    </td>
			</tr>
		</table>
		<p align="center">
		    <input type="submit" value="修 改">   
		    <input type="reset" value="重 置">
		</p>
	</form>
</body>
</html>

数据库表:

sys_user


sys_blog



最终功能截图:

Run on sever到达主界面:


点击任意其中一个链接,发现没有登录,会到达登录界面:

 

用一个没有的账户登录会提示不存在该用户,此时用户可以点击登陆下方的注册链接:

 

当昵称没有注册过时,会在输入框失去焦点时显示可以注册:

 

当注册过会在输入框失去焦点时,显示注册过,且不能注册:

 

点击注册后会携带值到登录页面:

 

登陆后到了index页面选择“查看我的所有博客”,由于用户刚刚注册,所以没有博客:

 

点击“退出登录”,登录Rose的账户:

   

查看Rose所有博客,共两页:


删除Rose最后一篇博客:

 

Rose添加博客:

   

 

将刚刚添加的博客标题改为“随便”

  

 

退出,再登录Gold的,看看他的博客,可以证明每个人的博客不一样了吧!

  


最终数据库表:

  



  就上述这些,感觉最难的还是处理一对多的关系时的传值问题,就是登录后把user保存在session域中,需要用的时候就取出来,退出登录时就把session域保存的那个user对象置为空。想了好久才想明白!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值