day034

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值