首先,该项目的结构图,如下。
一、导入jar包,并设置java包中的查找内容,包括.xml 文件。
<dependencies> <!--测试包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--引入PageHelper插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <!--介入aspectj的相关包 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.11</version> </dependency> <!--Spring + springMVC --> <!--spring的相关包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>4.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.5.RELEASE</version> <scope>test</scope> </dependency> <!-- c3p0数据源 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5-pre10</version> </dependency> <!--数据库--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.4</version> </dependency> <!--导入的是日志相关的包 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--带入cglib代理的包 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.4</version> </dependency> <!--servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--导入我们jstl的标签库的包 --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>javax.servlet.jsp.jstl-api</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>xom</groupId> <artifactId>xom</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <dependency> <groupId>org.jdom</groupId> <artifactId>jdom</artifactId> <version>1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <!--Mybatis jar包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!--MBG- mybatis 逆向生成--> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.6</version> </dependency> <!--Mybatis 和 Spring--> <!--An easy-to-use Spring bridge for MyBatis sql mapping framework.--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> </dependencies> <build> <finalName>SSMBook</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> <resource> <directory>src/main/webapp</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> <include>**/*.jsp</include> </includes> </resource> </resources> </build>
二、mybatis 逆向工程生成 POJO + dao接口 + mapper.xml
接着,新建 generator-config.xml 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/ssmbook" userId="root" password="123456"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="com.lr.ssmbook.pojo" targetProject=".\src\main\java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.lr.ssmbook.mapper" targetProject=".\src\main\java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!--指定dao接口生成的位置,mapper接口--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.lr.ssmbook.dao" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 指定数据库表 --> <table tableName="tb_user1" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> <table tableName="tb_book1" domainObjectName="Book" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> </context> </generatorConfiguration>
接着,新建一个MGBTest类,逆向工程生成 POJO + dao + mapper.xml
public class MGBTest { public static void main(String[] args) throws Exception{ org.apache.ibatis.logging.LogFactory.useLog4JLogging(); List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("src/main/webapp/config/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } }
生成之后的POJO是:Book.class, User.class
public class Book implements Serializable{ private Integer id; //id private String name;//书名 private String author;//作者 private Date pubdate;//发行日期 private String publication;//出版社 private Double price;//价格 private String image;//封面图片 private String remark;//描述
//getter setter 方法
}
public class User implements Serializable{ private Integer id;//id private String loginname;//登录名 private String password;//密码 private String username;//用户名 private String phone;//电话 private String address;//地址
//getter setter 方法
}
三、db.properties, log4j.properties 配置信息
db.properties :
#mysqldatabasesetting jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/ssmbook?useUnicode=true&characterEncoding=utf-8 jdbc.user=root jdbc.password=123456 jdbc.initialPoolSize=5 jdbc.maxPoolSize=20 jdbc.maxIdleTime=1000 jdbc.minPoolSize=6
log4j.properties:
log4j.rootLogger=INFO,console,file #-----------------------------------# #1 定义日志输出目的地为控制台 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out ####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ### #%c: 输出日志信息所属的类目,通常就是所在类的全名 #%m: 输出代码中指定的消息,产生的日志具体信息 #%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行 log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{ABSOLUTE}%5p %c{1}:%L-%m%n log4j.logger.org.quartz=INFO log4j.appender.file = org.apache.log4j.RollingFileAppender #日志文件输出目录 log4j.appender.file.File=src/logs/mylogs.log #定义文件最大大小 log4j.appender.file.MaxFileSize=10mb log4j.appender.file.DatePattern=yyyy-MM-dd'.log' log4j.appender.file.Threshold=INFO log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-ddHH\:mm\:ss}[%c][%t\:%r]-[%p]%m%n
四、applicationContext.xml 配置文件
applicationContext.xml 该配置文件,需要整合 mybatis 和 自动注入。
<?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: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/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--Spring 的配置文件,主要配置和业务逻辑有关的--> <context:component-scan base-package="com.lr.ssmbook"> <!--扫描所有的除了控制器--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--===================数据源,事务控制=====================================--> <context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="driverClass" value="${jdbc.driver}"/> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <!-- 初始化连接大小 --> <property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property> <!-- 连接池最大数量 --> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/> <!-- 连接池最大空闲 --> <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/> <!-- 连接池最小数量 --> <property name="minPoolSize" value="${jdbc.minPoolSize}"/> </bean> <!--=========================================================================--> <!--========================配置和 Mybatis 整合===============================--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据库连接池 --> <property name="dataSource" ref="dataSource"/> <!--指定mybatis全局配置文件--> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> <!--指定mybatis ,mapper 文件的位置--> <property name="mapperLocations" value="classpath:com/lr/ssmbook/mapper/BookMapper.xml"/> </bean> <!--配置扫描器,将mybatis 接口的实现加入到ioc容器中--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 注入sqlSessionFactory --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!--扫描所有dao接口的实现,加入的ioc容器--> <property name="basePackage" value="com.lr.ssmbook.dao"/> </bean> <!--配置一个可以执行批量的sqlSession--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> <constructor-arg name="executorType" value="BATCH"/> </bean> <!--=======================================================================--> <!--==============================事务控制的配置===========================--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--控制数据源--> <property name="dataSource" ref="dataSource"/> </bean> <!--配置基于注解的声明式事务--> <tx:annotation-driven transaction-manager="transactionManager" /> <!--========================================================================--> </beans>
五、springmvc-config.xml 配置文件
springmvc-config.xml 配置文件,主要是设置controller层的扫描、返回的格式等
<?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" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"> <!-- 启动mvc注解 设置默认的配置--> <mvc:annotation-driven /> <!-- 扫描controller --> <context:component-scan base-package="com.lr.ssmbook.controller"/> <!-- 不拦截静态资源 --> <!--<mvc:resources location="/WEB-INF/jsp/" mapping="/jsp/**"></mvc:resources>--> <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 定义跳转的文件的前后缀 ,视图模式配置,视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址--> <property name="prefix" value="/jsp" /> <property name="suffix" value=".jsp" /> </bean> <!-- 配置annotation 类型的处理映射器--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> <!--配置annotation 类型的处理器适配器--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> </list> </property> </bean> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </beans>
六、web.xml 配置文件
该web.xml 配置文件,主要是加载application.xml 和 springmvc-config.xml 配置文件并且监听logger日志等。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN " "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>SSMBook</display-name> <!-- 响应编码:过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- log4j日志输出 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <!--contextConfigLocation 参数用来指定 Spring 的配置文件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/applicationContext.xml</param-value> </context-param> <!--配置 Spring 的核心监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--定义 Spring Mvc 的前端控制器--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
七、dao 层
UserDao层接口:UserMapper,其中使用的方法通过注释来执行 sql 语句
public interface UserMapper { int deleteByPrimaryKey(Integer id); int insert(User record); int insertSelective(User record); User selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(User record); int updateByPrimaryKey(User record); /* * 根据登录名和密码查询用户 *@Param: String loginname * @Param: String password * @Return 找到返回对象,没有找到返回null * */ @Select("SELECT * FROM tb_user WHERE loginname = #{loginname} AND password = #{password}") User findWithLoginAndPsd(@Param("loginname")String loginname, @Param("password") String password); }
BookDao层接口:BookMapper
public interface BookMapper { int deleteByPrimaryKey(Integer id); int insert(Book record); int insertSelective(Book record); Book selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Book record); int updateByPrimaryKey(Book record); /* * 查询所有图书 * @Return 图书对象集合 * */ @Select("SELECT * FROM tb_book") List<Book> findAll(); public Book findOne(Integer id, String name); }
八、service 层
UserService接口:
public interface UserService { /** * 判断用户登陆 * param String loginname * param String password; * return 找到返回的 User 对象,没有找到返回 null */ User login(String loginname, String password); }
UserServiceImpl实现类:
@Service @Transactional public class UserServiceImpl implements UserService{ //自动注入 UserMapper @Autowired private UserMapper userMapper; /** * UserService 接口 login 方法实现 * */ @Override public User login(String loginname, String password) { return userMapper.findWithLoginAndPsd(loginname, password); } }
BookService接口:
public interface BookService { /** *查找所有图书 */ List<Book> getAll(); }
BookServiceImpl实现类:
@Service @Transactional public class BookServiceImpl implements BookService{ @Autowired private BookMapper bookMapper; @Override public List<Book> getAll() { return bookMapper.findAll(); } }
九、controller 层
UserController:
@Controller @RequestMapping("/users") public class UserController { @Autowired private UserService userService; //处理 login 请求 @RequestMapping("/login") public ModelAndView login(String loginname, String password, HttpSession session){ ModelAndView mav = new ModelAndView(); User user = userService.login(loginname, password); if (user != null){ session.setAttribute("user", user); mav.setView(new RedirectView("/books/main")); }else { mav.addObject("message", "登录名或密码错误"); mav.setViewName("/login"); } return mav; } }
BookController:
@Controller @RequestMapping("/books") public class BookController { @Autowired private BookService bookService; @RequestMapping("/main") public String main(Model model){ List<Book> book_list = bookService.getAll(); //将图书集合添加到 model 中 model.addAttribute("book_list", book_list); return "/main"; } }
十、login.jsp 和 main.jsp
login.jsp:
<%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>登陆</title> </head> <body> <form action="/users/login"> <h4 style="color: red;">${requestScope.message}</h4> <table> <tr> <td><label>登录名:</label></td> <td><input type="text" name="loginname" id="loginname"/></td> </tr> <tr> <td><label>密码</label></td> <td><input type="password" name="password" id="password"/></td> </tr> <tr> <td><input type="submit" value="登陆"/></td> </tr> </table> </form> </body> </html>
main.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" %> <%@ page isELIgnored="false" %> <% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%> <html> <head> <base href="<%=basePath%>"> <title>首页</title> <style type="text/css"> table{ border-collapse: collapse; border-spacing: 0px; border-left: 1px solid #888888; } th, td{ border-right: 1px solid #888888; border-bottom: 1px solid #888888; padding: 5px 15px; } th{ font-weight: bold; background: #cccccc; } </style> </head> <body> 欢迎[${sessionScope.user.username}]访问 <br> <table> <tr> <th>封面</th><th>书名</th><th>作者</th><th>价格</th> </tr> <c:forEach items="${requestScope.book_list}" var="book"> <tr> <td><img src="images/${book.image}" height="60"></td> <td>${book.name}</td> <td>${book.author}</td> <td>${book.price}</td> </tr> </c:forEach> </table> </body> </html>
十一、运行结果
由于数据库中,图片没给地址,所以显示为404,不过这都无伤大雅,哈哈。