1)、分页
2)、数据校验:jquery前端校验+JSR303后端校验
3)、ajax 校验和请求
4)、Rest风格的URI;使用HTTP协议请求方式的动词,来表示对资
源的操作(GET(查询),POST(新增),PUT(修改),DELETE(删除))。
1) 基础框架-ssm(SpringMVC4.3.7+Spring4.3.7+MyBatis3.4.2)
2) 数据库-MySQL
3) 前端框架-bootstrap快速搭建简洁美观的界面
4) 项目的依赖管理-Maven
5) 分页-pagehelper
6) 逆向工程-MyBatis Generator
JDK:1.8
Tomcat:8.0
MySQL:5.7
Eclipse:Mars2
Spring: spring4.3.7
Mybatis:mybatis3.4.2
Maven:maven3.3.9
打包方式为:war ,报错是因为缺少web.xml
添加web.xml
每次创建的时候maven 报错或者JDK版本问题,这里引入阿里云的镜像
下载jar包较快
在apache-maven-3.3.9conf中的settings配置
alimavenaliyun mavenhttp://maven.aliyun.com/nexus/content/groups/public/central
锁定JDK1.7版本配置
在里面配置
jdk17true1.71.71.71.7
Spring、Springmvc、Mybatis、数据库连接池、驱动包、其他( jstl,servlet-api,Junit )
访问https://mvnrepository.com/tags/maven 可以再这里导入所需的jar包坐标
4.0.0com.stackitssm-crud0.0.1-SNAPSHOTwarssm-crudssm-crudorg.springframeworkspring-webmvc4.3.7.RELEASEorg.springframeworkspring-jdbc4.3.7.RELEASEorg.springframeworkspring-aspects4.3.7.RELEASEorg.mybatismybatis3.4.2org.mybatismybatis-spring1.3.1c3p0c3p00.9.1mysqlmysql-connector-java5.1.41javax.servlet.jsp.jstljstl1.2javax.servletservlet-api2.5providedjunitjunit4.12test
引入完成
CharacterEncodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceRequestEncodingtrueforceResponseEncodingtrueCharacterEncodingFilter/*HiddenHttpMethodFilterorg.springframework.web.filter.HiddenHttpMethodFilterHiddenHttpMethodFilter/*org.springframework.web.context.ContextLoaderListenercontextConfigLocationclasspath:applicationContext.xmlDispatcherServletorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc.xmlDispatcherServlet/
创建jdbc.properties
jdbc.driveClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql:///ssm_crud_aggjdbc.user=rootjdbc.password=123456
-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
8.创建表
-- 部门表CREATE TABLE `tbl_dept` (`dept_id` int(11) NOT NULL AUTO_INCREMENT,`dept_name` varchar(255) DEFAULT NULL,PRIMARY KEY (`dept_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8-- 员工表CREATE TABLE `tbl_emp` (`emp_id` int(11) NOT NULL AUTO_INCREMENT,`emp_name` varchar(255) NOT NULL,`gender` char(1) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,`d_id` int(11) DEFAULT NULL,PRIMARY KEY (`emp_id`),KEY `fk_emp_dept` (`d_id`),CONSTRAINT `fk_emp_dept` FOREIGN KEY (`d_id`) REFERENCES `tbl_dept` (`dept_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
在pom.xml 中添加mybatis-generator 逆向工程的jar
org.mybatis.generatormybatis-generator-core1.3.5
在当前工程创建mbg.xml
-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
执行逆向工程
import java.io.File;import java.io.IOException;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration;import org.mybatis.generator.config.xml.ConfigurationParser;import org.mybatis.generator.internal.DefaultShellCallback;public class MybatisMBGTest {public static void main(String[] args) throws Exception {List warnings = new ArrayList();boolean overwrite = true;File configFile = new File("mbg.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);}}在Employee 中添加Department 生产getter和setter在EmployeeMapper 中添加/*** new add 带部门查询* @param example* @return*/List selectByExampleWithDept(EmployeeExample example);/*** new add 带部门查询* @param empId* @return*/Employee selectByPrimaryKeyWithDept(Integer empId);
在Employee 中添加Department 生产getter和setter
在EmployeeMapper 中添加
/*** new add 带部门查询* @param example* @return*/List selectByExampleWithDept(EmployeeExample example);/*** new add 带部门查询* @param empId* @return*/Employee selectByPrimaryKeyWithDept(Integer empId);
mybatis使用 批量操作的
package com.stackit.ssm.test;import java.util.UUID;import org.apache.ibatis.session.SqlSession;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 com.stackit.ssm.beans.Department;import com.stackit.ssm.beans.Employee;import com.stackit.ssm.mapper.DepartmentMapper;import com.stackit.ssm.mapper.EmployeeMapper;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(value="classpath:applicationContext.xml")public class MapperTest {@AutowiredDepartmentMapper departmentMapper;@AutowiredEmployeeMapper employeeMapper;@AutowiredSqlSession sqlSession;@Testpublic void testCRUD() {EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);for (int i = 0; i < 1000; i++) {String uuid = UUID.randomUUID().toString().substring(0, 5)+i;mapper.insertSelective(new Employee(null, uuid, "M", uuid+"@atguigu.com", 1));}}}
【描述】win10系统,Mysql5.7安装版,出现中文乱码问题,数据库和数据库表均已设置UTF-8编码,但是依旧出现乱码。
【经历】上网查了,说要修改my.ini,但是在C:Program FilesMySQLMySQL Router 8.0etc目录下以及C:Program FilesMySQLMySQL Server 5.7目录下均未找到该文件。
有一种方法:显示隐藏的ProgramData文件夹,将C:ProgramDataMySQLMySQL Server 5.7下的my.ini复制到安装目录C:Program FilesMySQLMySQL Server 5.7下,然后运行my.ini里面的提到的命令,试了几下,也没用,可能是自己不太会弄吧。
【方法】于是就直接修改了C:ProgramDataMySQLMySQL Server 5.7下的my.ini文件。
【步骤】
1、显示隐藏文件夹
2、找到C:ProgramDataMySQLMySQL Server 5.7下的my.ini文件,右键用Notepad++打开
3、找到[mysql],在# default-character-set=的下一行添加default-character-set=utf8(图中第67行)
4、找到[mysqld],在# character-set-server=的下一行添加character-set-server=utf8(图中第102行)
5、保存文件,重启数据库,测试
【效果】
修改之前
修改之后
【变化】character_set_database和character_set_server的值由原来的latin1变为utf8
【说明】我的MySQL安装好后,使用过一段时间,之前没涉及中文字符(当然,之前每次新建数据库时都会设置UTF-8编码),后面发现有中文乱码问题,经过一番折腾之后,无奈的我直接修改了隐藏的my.ini文件,修改好后,重新试了一下,不会乱码了。
不过还有几个编码是gbk,而不是utf8(如图所示),也试过在[client]中配置default-character-set=utf8和在[mysqld]中配置collation-server = utf8_general_ci init_connect='SET NAMES utf8',但是都没用,那三个依旧还是gbk,不过目前看来,不会有影响。(我每次新建数据库时都会设置UTF-8编码,并且在连接数据库时,会在url中加上?characterEncoding=utf-8)
在命令行中输入 set names utf8;可以修改那3个"老顽童"
具体此方法是否会有"后遗症"尚不清楚,不过目前来看确实解决了我的中文乱码问题。
【建议】修改隐藏的my.ini之前,最好先备份一个,万一改崩了,还有"后悔药"。另外,折腾完之后,建议去掉勾选的"查看隐藏的项目",既然它们想藏起来就让它们藏吧,哪天确实需要再用它们的时候,再召唤,万一误删了这些"害羞"的重要文件就麻烦了。
查询
• 1、访问index.jsp页面
• 2、index.jsp页面发送出查询员工列表请求
• 3、EmployeeController来接受请求,查出员工数据
• 4、来到list.jsp页面进行展示
• 5、pageHelper分页插件完成分页查询功能
• URI:/emp
在pom.xm中引入mybatis helper 分页插件的jar 包
com.github.pagehelperpagehelper5.0.0
在mybatis-config.xml 中配置
报错:java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig
需要servlet-api 需要3.0的支持
在pom.xml 中配置
javax.servletjavax.servlet-api3.0.1provided
Spring提供虚拟测试
package com.stackit.ssm.test;import java.util.List;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.mock.web.MockHttpServletRequest;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;import com.github.pagehelper.PageInfo;import com.stackit.ssm.beans.Employee;/*** spring测试模块* 报错:java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig* 需要servlet-api 需要3.0的支持* @author Administrator**/@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "classpath:applicationContext.xml", "classpath:springmvc.xml" })@WebAppConfigurationpublic class MVCTest {// 传入springmvc的IOC@Autowired // 只能自动注入IOC容器里面的,需要加入WebApplicationContext context;// 虚拟mvc请求,获取处理结果MockMvc mockMvc;@Beforepublic void initMockMvc() {mockMvc = MockMvcBuilders.webAppContextSetup(context).build();}@Testpublic void testPage() throws Exception {MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pn", "5")).andReturn();// 模拟发送请求//请求成功以后,请求域中有pageInfo,我们可以取出pageInfo进行验证MockHttpServletRequest request = result.getRequest();PageInfo info = (PageInfo) request.getAttribute("pageInfo");System.out.println("当前页码:"+info.getPageNum());System.out.println("总页码:" +info.getPages());System.out.println("总记录数:" +info.getTotal());System.out.println("在页面需要连续显示的页码");int[] nums = info.getNavigatepageNums();for (int i : nums) {System.out.println(i);}System.out.println("员工数据");List list = info.getList();for (Employee employee : list) {System.out.println(employee.getEmpId() + " ==== " + employee.getEmpName() + " ==== " + employee.getDepartment().getDeptName());}}}
C3P0 :java.sql.SQLException: No suitable driver
连接的四个参数有误
taglibsstandard1.1.2
Maven项目出现错误:
java.lang.ClassNotFoundException: org.apache.taglibs.standard.tlv.JstlCoreTLV
错误的引入:
javax.servlet.jsp.jstljstl1.2
正确的引人:
javax.servletjstl1.2runtime
---------------------
或者:
jstljstl1.2