ifanr2基于框架实现
2015-07-23 09:39
302 查看
ifanr2基于框架实现
暑假实习项目,本来想做一个类似于爱范儿的科技新闻媒体网站,顺带着运用一下框架。因为框架本来就可以极大的提高开发效率,并且使开发简单化 模块化。
hibernate的配置实现直接集成在spring中,没有在单独的hihibernate.cfg.xml中
注意基于DBCP数据库连接池,除了需要导入hibernate的包之外,还需要导入Apache 的dbcp pool collection 这几个包
hibernate实体类基于注解实现,设置实体类的全限定包名,还有设置hibernate的属性
注意springmvc拦截器配置,servlet-name 中dispatcher,则springmvc配置的文件名为dispatcher-servlet.xml,默认位置为classpath,也就是WEB-INF文件夹
@Controller 控制器
@RequestMapping URL映射
@PathVariable 路径参数
暑假实习项目,本来想做一个类似于爱范儿的科技新闻媒体网站,顺带着运用一下框架。因为框架本来就可以极大的提高开发效率,并且使开发简单化 模块化。
spring + hibernate +springMVC
spring
1.导入spring的相关包,和依赖包commons-logging.jar
2.在web.xml中配置spring的监听
<!-- 引入spring --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
3.在applicationContext.xml中配置bean
<!-- spring注解扫描的包 --> <context:component-scan base-package="com.kanbujian" /> <bean id="user" class="com.kanbujian.model.User"></bean> <bean id="author" class="com.kanbujian.model.Author"></bean> <bean id="tag" class="com.kanbujian.model.Tag"></bean> <bean id="news" class="com.kanbujian.model.News"></bean> <bean id="comment" class="com.kanbujian.model.Comment"></bean>
4.依赖注入
<!-- User服务类和数据库处理类 --> <bean id="userDao" class="com.kanbujian.DAO.UserDAO"> <property name="sessionFactory" ref="mySessionFactory"></property> </bean> <bean id="userService" class="com.kanbujian.service.UserService"> <property name="userDao" ref="userDao"></property> </bean>
Hibernate
hibernate的配置实现直接集成在spring中,没有在单独的hihibernate.cfg.xml中
1.在spring的applicationContext.xml中集成hibernate,创造数据库连接池,基于DBCP
<!-- 数据源配置 数据库连接信息 --> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/ifanr" /> <property name="username" value="root" /> <property name="password" value="XXXXX" /> </bean>
注意基于DBCP数据库连接池,除了需要导入hibernate的包之外,还需要导入Apache 的dbcp pool collection 这几个包
2.在spring的applicationContext.xml创建sessionfactory
<!-- sessionFactory配置 --> <bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="annotatedClasses"> <list> <value>com.kanbujian.model.User</value> <value>com.kanbujian.model.News</value> <value>com.kanbujian.model.Tag</value> <value>com.kanbujian.model.Author</value> <value>com.kanbujian.model.Comment</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.hbm2ddl.auto=update <!-- update : 最常用的属性,也根据model类生成表,即使表结构改变了,表中的行仍然存在,不会删除以前的行 --> hibernate.format_sql=true hibernate.show_sql=true hibernate.current_session_context_class=thread </value> </property> </bean>
hibernate实体类基于注解实现,设置实体类的全限定包名,还有设置hibernate的属性
3.注解实体类
使用注解,来映射实体类,例如Userpackage com.kanbujian.model; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="users") public class User { private int UserId; private String Username; private String UserGender; private String UserMail; private String UserPassWord; @Id public int getUserId() { return UserId; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((UserPassWord == null) ? 0 : UserPassWord.hashCode()); result = prime * result + ((Username == null) ? 0 : Username.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (UserPassWord == null) { if (other.UserPassWord != null) return false; } else if (!UserPassWord.equals(other.UserPassWord)) return false; if (Username == null) { if (other.Username != null) return false; } else if (!Username.equals(other.Username)) return false; return true; } public void setUserId(int userId) { UserId = userId; } public String getUsername() { return Username; } public void setUsername(String username) { Username = username; } public String getUserGender() { return UserGender; } public void setUserGender(String userGender) { UserGender = userGender; } public String getUserMail() { return UserMail; } public void setUserMail(String userMail) { UserMail = userMail; } public String getUserPassWord() { return UserPassWord; } public void setUserPassWord(String userPassWord) { UserPassWord = userPassWord; } }
4.操作数据库
下面就可以获取sessionFactory,进而获取session,完成对数据库的操作。例如UserDAO.java<span style="font-family:Microsoft YaHei;">package com.kanbujian.DAO; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.kanbujian.model.User; public class UserDAO { SessionFactory sessionFactory; Session session; public boolean checkLogin(User user){ session=sessionFactory.getCurrentSession(); List<User> list=list(); boolean flag=list.contains(user); return flag; } public List<User> list() { // TODO Auto-generated method stub session=sessionFactory.getCurrentSession(); session.beginTransaction(); /* from User 后面跟的和类名对应,不是数据库中的表名*/ List<User> result=(List<User>) session.createQuery("from User").list(); /*list.contain() 与 hibernate中封装session.contains()的区别 * User u=new User(); u.setUsername("jay"); u.setUserPassWord("12345"); System.out.println(result.contains(u)); */ System.out.println("User 数据库遍历成功!"); session.getTransaction().commit(); return result; } public User show(String username){ /*session=sessionFactory.getCurrentSession(); session.beginTransaction(); 报could not initialize proxy - no Session异常, load生成的是代理对象 //user u=(user)session.load(user.class,username); User u=(User)session.get(User.class,username); session.getTransaction().commit(); return u;*/ return getUserByUsername(username); } public User getUserByUsername(String username){ List<User> li=list(); User u=new User(); Iterator<User> it=li.iterator(); while(it.hasNext()){ User temp=it.next(); if(temp.getUsername().endsWith(username)) return temp; } System.out.println("未根据用户名找到给定用户"); return u; } public void add(User u){ session=sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(u); session.getTransaction().commit(); } public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession() { return session; } public void setSession(Session session) { this.session = session; } } </span>
springmvc
1.在web.xml中注册springmvc的拦截器
<!-- 字符编码处理的过滤器 --> <filter> <filter-name>CharacterFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<!-- spring mvc 拦截器配置 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <!-- <url-pattern>*.do</url-pattern> 扩展映射 以前缀”*.”开头的是用来做扩展映射的--> <!-- <url-pattern>/</url-pattern> 路径映射 以”/’开头和以”/*”结尾的是用来做路径映射的--> <!-- / 拦截所有的请求,包括静态文件 css js jpg等等 --> <url-pattern>/</url-pattern> </servlet-mapping>
注意springmvc拦截器配置,servlet-name 中dispatcher,则springmvc配置的文件名为dispatcher-servlet.xml,默认位置为classpath,也就是WEB-INF文件夹
2.diapatcher-servlet.xml的配置
<span style="font-family:Microsoft YaHei;"><?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!--注解扫描 --> <context:component-scan base-package="com.kanbujian" /> <!-- MVC 默认注册Handlermapping 和 viewResolver --> <mvc:annotation-driven/> <!-- spring 内部同样可以实现对静态资源的访问 --> <!-- 注意 /** 表示文件包括子文件夹内的所有文件 ;location中以/结尾 --> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="/css/" mapping="/css/**"/> <!-- 映射页面路径 前缀 后缀 /WEB-INF/jsp/xxx.jsp --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> <!-- 全局异常处理,注入exceptionMappings属性,异常与处理页面映射 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 定义默认的异常处理页面 --> <property name="defaultErrorView" value="error" /> <!-- 定义异常处理页面用来获取异常信息的变量名,如果不添加exceptionAttribute属性,则默认为exception --> <property name="exceptionAttribute" value="exception" /> <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页面名作为值 --> <property name="exceptionMappings"> <props> <prop key="com.kanbujian.exception.UserException">error</prop> </props> </property> </bean> </beans> </span>
3. 控制器的注解实现
前端控制器,当接受到特定URL,将映射的页面返回到浏览器@Controller 控制器
@RequestMapping URL映射
@PathVariable 路径参数
<span style="font-family:Microsoft YaHei;">package com.kanbujian.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.kanbujian.exception.UserException; import com.kanbujian.model.User; import com.kanbujian.service.UserService; @Controller @RequestMapping("/user") public class UserController { private static UserService us; public UserService getUs() { return us; } @Resource(name="userService") public void setUs(UserService us) { this.us = us; } /* //展示用户信息 public String list(Model model){ List<User> Users=us.list(); Map<String,User> UserMap=new HashMap<String,User>(); // model.addAttribute("Users",Users); Iterator<User> it=Users.iterator(); while(it.hasNext()){ User u=it.next(); System.out.println(u.getUsername()+" "+u.getUserPassWord()); UserMap.put(u.getUsername(), u); } //map形式 // model.addAttribute("UserMap", UserMap); //直接list形式 model.addAttribute("UserMap", Users); //--just for testing 测试addAllAttributes(list) jsp遍历--> List<String> strList=new ArrayList<String>(); strList.add("hsuhsush1"); strList.add("shdushdiu2"); strList.add("ahsiasui3"); model.addAllAttributes(strList); model.addAttribute("PageTitle", "心系"); return "/User/list"; } // 添加用户信息 @RequestMapping(value="/add",method=RequestMethod.GET) public String add(Model model){ model.addAttribute("User1",new User()); return "/User/add"; } @RequestMapping(value="/add",method=RequestMethod.POST) public String add(@Validated User u,BindingResult br){ if(br.hasErrors()) return "redirect:/User/add"; us.add(u); return "redirect:/User/Users"; }*/ /** * 展示用户信息 * @param Username 用户名 * @param model * @param session * @return */ @RequestMapping(value="/{Username}/show",method=RequestMethod.GET) public String show(@PathVariable String Username,Model model,HttpSession session){ /*如果session中不存在登陆信息,则不允许进入用户信息查看页面,转到登陆页面*/ if(session.getAttribute("LoginUser")==null){ //System.out.println(session.getAttribute("LoginUser")); model.addAttribute("errorMessqge", "请您先登陆"); return "redirect:/login"; } /*如果session存的LoginUser与Url中请求的用户名不相同,返回错误请求信息*/ User u=(User)session.getAttribute("LoginUser"); if(!u.getUsername().equals(Username)){ throw new UserException("用户未登陆,无信息查看权限"); /*return "redirect:/error";*/ } User user=us.show(Username); model.addAttribute(user); model.addAttribute("PageTitile",user.getUsername()); return "/user/show"; } @RequestMapping(value="/{Username}/show",method=RequestMethod.GET,params="json") public String show(@PathVariable String Username){ return "/user/show"; } /* // 修改用户信息 @RequestMapping(value="/{Username}/update",method=RequestMethod.GET) public String update(@PathVariable String Username,Model model){ model.addAttribute("User",new User()); System.out.println("dao zhe mei ?"); return "/User/update"; } @RequestMapping(value="/{Username}/update",method=RequestMethod.POST) public String update(@Validated User u,BindingResult br,Model model){ if(br.hasErrors()) return "/User/update"; us.update(u); return "redirect:/User/Users"; } @RequestMapping(value="{Username}/delete",method=RequestMethod.GET) public String delete(@PathVariable String Username,Model model){ us.delete(Username); return "redirect:/User/Users"; } */ }</span>
4.返回到特定jsp页面
<span style="font-family:Microsoft YaHei;"><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@include file="inheader.jsp" %> <c:forEach items="${newsMap }" var="news"> <div style="width:640px ;height:340px ;margin:20px auto;padding:20px 20px" > <div style="width:640px ;height:40px ;margin:10px auto;padding:5px 5px"> <h3><a href="../news/${news.getNewsId().toString()}/detail">${news. getTitle()}</a></h3> <div style="width:200px ;height:145px ;"> <img alt=${news. getTitle()} src="../images/${news. getTitle()}.jpg"> </div> <div style="width:400px ;height:145px ;position: relative; left: 210px; bottom: 145px;margin:0px 20px;"> <p>${news.getContent() }</p> </div> </div> </div> </c:forEach> <%@include file="infooter.jsp" %> </span>
相关文章推荐
- C# 委托(delegate)使用之一二三步
- redis 中文文档
- 用户首选项数据
- JAXB初步的学习
- 自定义lable指定范围的字体颜色
- Linux 下面编程提高代码执行效率的小技巧
- Error VS Exception
- jvm规范规定的对类(或者接口)初始化的情况
- Codeforces Round #313 (Div. 2) C. Gerald's Hexagon
- CPU亲和性(affinity)及与亲和性有关的两个函数 sched_setaffinity()和 sched_getaffinity()
- 【学习笔记】android动画的不同实现方式以及要点
- iOS开发 ----- 学生管理系统改进版
- EditText的android:inputType属性
- Cygwin下 如何清屏
- Android Studio第一次启动跳不过“ downloading components”解决方案
- win7_oracle11g_64位连接32位PLSQL_Developer
- HDOJ 5296 Annoying problem
- 程序开发中的各种术语
- svn checkout时连接不到服务器,重装也没有弹出用户名和密码输入框的问题
- Android获取屏幕大小(Px)