spring学习笔记——spring Hello world Web版
来源:互联网 发布:moedaze 优化 编辑:程序博客网 时间:2024/06/04 17:58
spring对我来说已经不陌生了,在与同学合作的项目中经常用到,可是对spring一直都没有一个清晰地知识结构,想来想去决定开博客写下自己的学习轨迹。
本人自选教材为《Spring3.X企业应用实战》,在此对其细致的讲解表示衷心感谢!
首先来个Hello World 感受一下Spring为开发带来的变化。
文件结构如下:
架spring项目首先肯定是spring库,在官网上找了半天,各种让去git上下,看源码是方便了,可是release版的jar包该去哪找啊喂!
在CSDN上找了个下载资源:http://download.csdn.net/detail/jiangw1235/5973995
东西很全,可以用。
项目的功能是用户登录,在登录后会有一条日志插入进数据库中。
项目用了注解方式注入bean,所以先配注解扫描器:
在<beans>下:
<context:component-scan base-package="dao"/><context:component-scan base-package="service"/>
配数据源:这里用的是纯粹的spring封装jdbc的方式
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/test"> </property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean>配一个jdbc模板类:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" />这个作为到层的底层支持。
OK可以写dao了
public class User { private int id; private String name; private String password; private int departId;}public class Log { private int id; private int userId; private String ip; private Date date; public int getId() { return id; }}package dao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import po.Log;@Repository //repository是仓库,储藏室的意思,这里意思应该是“存储层”public class LogDao {@Autowired//注解方式注入对象,通过反射绕过java访问域的限制,连set方法都不需要了。private JdbcTemplate jdbcTemplate;public void insertLoginLog(Log log){String sqlStr = "insert into log(userid,ip,date) values(?,?,?)";Object args[] = new Object[]{log.getUserId(),log.getIp(),log.getDate()};jdbcTemplate.update(sqlStr,args);//强大的jdbc模板类,由spring提供,在applicationContext中进行装配,好像没有找到有关分页的操作,//是自己做template类的重要参考}}
package dao;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import po.User;@Repositorypublic class UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public User login(String userName,String pass){String sql = "select * from user where name = ? and password = ?";//返回键值对的形式值得学习List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, new Object[]{userName,pass});if(list.size()==1){Map<String,Object> map = list.get(0);User user = new User();user.setId(((Long) map.get("id")).intValue());user.setName((String) map.get("name"));user.setPassword((String) map.get("password"));user.setDepartId(((Long) map.get("deptid")).intValue());return user;}return null;}}
dao写好开始写service:
注释中提到,在这一层用到了自动事务,这个需要在xml中配置。package service;import java.sql.Date;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import po.Log;import po.User;import dao.LogDao;import dao.UserDao;@Service//service层,public class UserService {@Autowiredprivate UserDao userDao;@Autowiredprivate LogDao logDao;//在applicationContext中配置了AOP,使得每个在Service中的方法都有了自动事务。但如下面这句,//只有一句话,他是如何做到总是在最前面开事务,又在最后面管事务的,细节需要在学习public User login(String userName,String pass){return userDao.login(userName, pass);}public void doLog(User user){Log log = new Log();log.setUserId(user.getId());log.setDate(new Date(new java.util.Date().getTime()));log.setIp("127.0.0.1");logDao.insertLoginLog(log);}}
<!-- 事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" /><!-- 使用事务管理类使service中所有的方法都添加事务 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true" > <aop:pointcut expression="execution(* service..*(..))" id="serviceMethod"/> <!-- 此处即可看作是自动事务+AOP,前面定义了自动事务的对象,在此处的aop设置中引用之 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" /> </aop:config>这一过程略显复杂,我也只大概知道意图。
书中在这时对service做了单元测试,我也借此熟悉了一下单元测试的过程:
1.导入Junit4.5包,4在spring3.2.4中好像出了问题。
2.建测试文件夹,建包,建一个普通的类,加上Junit注解就可以使用Junit测试了
package test;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import po.User;import service.UserService;//这个类是spring的测试类,spring的应用只需要导入包,然后配置applicationContext就OK了。轻量级就体现在这//至于在普通java项目中怎么初始化Ioc容器,还要继续学习。@RunWith(SpringJUnit4ClassRunner.class)//这个注解是junit的,标记这个类可以使用junit执行,但这些东西毕竟是spring框架的,具体的驱动类自然由spring提供@ContextConfiguration(locations={"/applicationContext.xml"})//这个注解用来指定这个test类运行的上下文,来自springFramework的test包public class TestUserService {@Autowiredprivate UserService userService;@Test//标记了这个注解的方法会run as junit的时候被执行,否则是不执行的。public void testLogin(){User u = userService.login("test", "123456");userService.doLog(u);System.out.println(u.getName()+" "+u.getPassword()+" "+u.getDepartId());}}测试通过,下面就要写Web有关的东西了。该项目用了Spring MVC作为视图层,所以在web.xml中配置Spring MVC的有关内容。另外Web容器要负责初始化Spring框架,所以,有关Spring的监听、配置引入等也在其中。
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>springTest1</display-name> <!-- <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> --> <context-param> <!-- 让javaEE载入spring的上下文配置 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <!-- 引入Ioc容器了!负责启动Ioc容器监听器,原来javaEE靠这个来初始化spring--> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <!-- spring MVC的载体上场,一个大servlet,主控Servlet,名字就能看出来,专管Dispatch --> <servlet-name>mainServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <!-- javaEE的配置,吧主控servlet挡在入口,拦截所有的.html请求,.html是个技巧,很好的隐藏了技术又能优化搜索引擎抓取,真想请求静态html的时候可以用.htm来请求 --> <servlet-mapping> <servlet-name>mainServlet</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping></web-app>接下来在WEB-INFO下面建立对mainServlet的配置文件,通过为逻辑名添加前、后缀的方法来规定跳转页面文件与逻辑名称的映射关系,这个文件的文件头与applicationContext.xml相同,也同样在<beans>下书写内容。
<context:component-scan base-package="action"/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
配置好了Spring MVC,我们可以写控制层代码了,控制层代码在这里居然是个普通类!没继承任何父类,没实现任何接口。用最朴素的方式实现功能!
public class LoginCommand { private String userName; private String password;}package action;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import po.LoginCommand;import po.User;import service.UserService;@Controller//MVC嘛,这是控制层public class LoginController {//这个类没继承任何父类,没实现任何接口@Autowiredprivate UserService userService;@RequestMapping(value="/index.html")//方法对应的请求路径public String loginPage(){//不带参的跳转可以直接返回字符串return "login";}@RequestMapping(value="/login.html")public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){ //带参的跳转返回ModelAndView User user = userService.login(loginCommand.getUserName(),loginCommand.getPassword());if(user!=null){userService.doLog(user);request.getSession().setAttribute("user", user);return new ModelAndView("main");}return new ModelAndView("login","error","用户名或密码错误");}}下面可以写jsp页面啦!终于要写完啦~
<body> <div>${error}</div> <div> <form action='<c:url value="/login.html"/>' method="post"> 用户名:<input type="text" name="userName" /><br/> 密 码:<input type="password" name="password" /><br/> <input type="submit" value="提交" /> </form> </div>EL表达式显示动态值
欢迎页面:
<div> 欢迎您!${user.name} </div>总体来看,用spring开发时非常轻快,没有继承庞大的父类,没有实现复杂的接口,页面跳转也非常简洁,想要对象就注解一下,直接拿来用…崇尚简单就是spring的风格。
第一篇就到这里吧,叙述欠妥之处望高手谅解,也请不吝指点。
- spring学习笔记——spring Hello world Web版
- Spring学习笔记 Hello World
- Spring学习笔记 Hello World (code)
- Spring 学习笔记一 hello world
- Spring Data学习笔记-Hello world
- Spring学习笔记-1:SpringMVC hello world
- Spring-Boot学习笔记一:Hello World
- Spring学习笔记-1:SpringMVC hello world
- spring学习笔记——spring Hello world 普通java项目版 分析类的加载与装配
- Spring boot 学习笔记(1)——hello world创建,属性application.properties、 yml配置
- Spring Web Service 学习之Hello World篇
- Spring Web Service 学习之Hello World篇
- spring boot 学习笔记(002) Hello world
- Spring Boot学习笔记-从Hello World开始 (一)
- Spring Boot系列——Hello World
- Spring Security oAuth学习之Hello World
- Spring学习第一天: Hello World
- 《spring-boot学习》-02-hello world
- IOS查看crash记录
- tcp的option字段
- C# 处理文件的操作( File静态类 和 FileInfo普通类 ,他们用于复制,删除,创建,等等 不包含读写)
- MFC窗口最大化
- linux 下 安装使用 cmake
- spring学习笔记——spring Hello world Web版
- Java中hashmap和hashtable的区别
- 一次.NET Web应用程序安装包的制作经历:Sql数据库安装的3种方式
- 参照大牛 结合自己的理解C++设计模式---单例模式( SingleTon Pattern)
- J.U.C之CountDownLatch
- C++类中的static数据成员,static成员函数
- 【U盘无法停止通用卷 装机吧教你解决】
- 无名管道的C++封装
- 使用vspd虚拟com,打开失败