SpringMVC是Spring框架的一个模块,是基于mvc的webframework模块。
Web应用框架(Web application framework)
是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。
mvc是一种设计模式,即model-view-controller,
mvc在b/s系统下的应用:
1)【前端控制器】 DispatcherServlet
作用:接收请求,响应,也是中央转发器
2)【处理器映射器】 HandlerMapping
作用:根据url查找Handler
3)【处理器适配器】 HandlerAdapter
作用:按照特定规则去执行Handler,规则即HandlerAdapter要求的规则
注意:编写Handler时需要按HandlerAdapter要求去编写,这样适配器才可以去正确执行Handler
4)【视图解析器】 ViewResolver
作用:根据逻辑视图解析成真正的视图(view)
5)【视图】 View
View 是一个接口,实现类支持不同的view类型(jsp,FreeMarker,pdf,excel…)
处理请求参数
当客户端打开浏览器要访问服务器时,可能会带着一些http请求参数过来.
这时,服务器需要获取http参数进行业务处理,如何处理http请求并获取参数?
-
GET方式和POST方式.
-
RESTFul方式(推荐)
为了简化GET请求的写法,可以使用RESTFul方式,用法:
1、需要使用注解@PathVariable来获取请求路径中的参数值,@PathVariable用来绑定值
2、通过{???}获取路径中传递来的值
@RestController
@RequestMapping(“user”)
public class UserController {
@RequestMapping(“insert”)
public Object insert(Integer id,String name,Integer age){
return id+name+age;
}
@RequestMapping("insert2/{id}/{name}/{age}")
public void insert2(@PathVariable Integer id,
@PathVariable String name,
@PathVariable Integer age){
System.out.println(id+name+age);
}
}
↓ ↓ ↓
@PathVariable 是SpringMVC提供的注解,只要是处理请求的就是SpringMVC提供的注解.
@RequestMapping有两个分支:
1.@GetMapping–只接收Get方式提交的数据
2.@PostMapping–只接收Post方式提交的数据
@RestController
↓
@Controller
@ResponseBody 二合一
解析数据是SpringMVC框架自己就会做的,
pom里加jdbc坐标(导jar包)
注册驱动
获取数据库连接
获取传输器
执行SQL
解析结果集
释放资源
连接mysql数据库的时候一般都会在url后面添加useUnicode=true&characterEncoding=UTF-8
添加的作用是:指定字符的编码、解码格式。
例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。
这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:
1.存数据时:
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,
然后再将解码后的字节码重新使用GBK编码存放到数据库中。
2.取数据时:
在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,
然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
与Statement相比
两者之间有如下差异:
1.概念上
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。
createStatement不会初始化,没有预处理,每次都是从0开始执行SQL。
2.变量上
prepareStatement可以在SQL中用?替换变量;
createStatement不支持 ? 替换变量,只能在sql中拼接参数;
3.功能上
如果想要删除三条数据
对于createStatement,需要写三条语句
String sql = “delete from category where id = 2” ;
String sql = “delete from category where id = 3” ;
String sql = “delete from category where id = 7” ;
而prepareStatement,通过set不同数据只需要生成一次执行计划,可以重用
String sql = “delete from category where id = ?” ;
使用createStatement 对象。
在对数据库只执行一次性存取的时侯,用 createStatement对象进行处理。
PreparedStatement对象的开销比createStatement大,对于一次性操作并不会带来额外的好处。
createStatement每次执行sql语句,相关数据库都要执行sql语句的编译,
preparedstatement是预编译得,preparedstatement支持批处理
4 可重复性
对于上面的两段代码而言:createStatement必须给定一个值
而preparedstatement,对象的key,value都可以自己定义,
而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。
这种转换实现不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。
选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,
而且两次之间的差别仅仅是变量的不同。
如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。
execute()方法:
作用是将字符串内容当作命令来执行。
@RestController
@RequestMapping(“FromTest”)
public class UP {
@RequestMapping(“UPLOAD”)
public Object UPLOAD(UP_A UA) {//UP_A UA这里,实体类对象获取到了表单请求提交的值
Connection c = null;
PreparedStatement p = null;
try {
String sql =“insert into sb_student(name,age,sex,hobby,STUDY_LEVEL,STUDY_DATE)values(?,?,?,?,?,?)”;
c = getConneection();
p = c.prepareStatement(sql);
p.setObject(1,UA.getName());
p.setObject(2,UA.getAge());
p.setObject(3,UA.getSex());
p.setObject(4,UA.getHobby());
p.setObject(5,UA.getSTUDY_LEVEL());
p.setObject(6,UA.getSTUDY_DATE());
p.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
close(c, p);
}
return UA;
}
public static Connection getConneection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");//注册驱动
String url = "jdbc:mysql://localhost:3306/tedu2107?characterEncoding=utf8";//DB连接,指定字符的编码、解码格式为utf-8。
Connection c = DriverManager.getConnection(url, "root", "root");
return c;//返回给调用者一个DB连接信息
}
public static void close(Connection c, PreparedStatement s) {
if (s != null) {
try {
s.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (c != null) {
try {
c.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
处理器映射器 根据 url 地址里的信息 找到 对应的类资源
表单提交的前提:
1.必须是form
2.必须有submit按钮
3.必须配置name属性
model一创建,TOMCAT就同步部署了,只要建立启动类,游览器就能访问
cn.tedu 总包
controller层 子包
pojo子包(实体类)
RunApp文件启动类
SpringMVC----接收请求响应任务
与前端直接交互 第一棒
spring框架想要实现—代码分层
三大核心组件的关系
Bean、Context、Core三大核心组件的关系:
Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context要解决的问题,对 Context 来说它就是要发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好这种关系。
所以 Context 就是一个Bean关系的集合,这个关系集合又叫 Ioc 容器,一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。
那 Core 组件又有什么用武之地呢?其实Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些类的工具,从这个角度看来,Core 这个组件叫 Util 更能让你理解。
把Bean 比作一场演出中的演员的话,那 Context 就是这场演出的舞台背景,而 Core应该就是演出的道具了。
只有他们在一起才能具备能演出一场好戏的最基本的条件。
https://blog.csdn.net/u012932876/article/details/117465363