前端控制器配置:
第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析
第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
使用此种方式可以实现 RESTful风格的url
处理器映射器:
对标记@Controller类中标识有@RequestMapping的方法进行映射。在@RequestMapping里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。
注解处理器适配器和注解的处理器映射器是配对使用。理解为不能使用非注解映射器进行映射。
<mvc:annotation-driven><mvc:annotation-driven>可以代替下边的配置:
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
实际开发使用:mvc:annotation-driven
@Controller //代表是一个控制器
@RequestMapper('user') //作用类相当于命名空间
@RequestMapper("addUser") //请求方法路径
@RequestBody //该方法可以做出ajax的响应 将返回值的字符串,作为文本响应到客户端。
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置jsp路径的前缀-->
<property name="prefix" value="/WEB-INF/jsp"/>
<!--配置jsp路径的后缀-->
<property name="suffix" value=".jsp"/>
</bean>
二,两种跳转方式
在Servlet和struts里面我们知道有两种跳转方法
1,请求转发 【项目内部,一次请求一次响应】
2,请求重定向【可以转发到外部的项目,两次请求两次响应】
同理springmvc里面也提供了这两种方法
在Controller里面的返回值可以是String ModelAndView 如果是ModelAndView默认的就是请求转发
如 return "index.jsp" 这种方法是默认的请求转发 这个写法====return "forward:index.jsp"
如 return "redirect:index.jsp"这种方法是就重定向到index.jsp页面
响应json对象到客户端
1,实现方法
①,可以使用上面的方法组装一个json的字符串,让Handler里面的方法返回一个字符串就可以了
②,springmvc里面内置了jackson的json生成和解析的方法,【但是要导jackson的包】
中文乱码处理,在web.xml配置过滤器,CharacterEncodingFilter
<!-- 进行springmvc的中文乱码处理 -->
<filter>
<filter-name>charset</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charset</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
一,什么是RestFul
什么是rest?当我看到这个词的时候,我也不知道,我还以为是休息,最后查了一下,做web开发必须要知道rest
好了,就来简单介绍一下rest
rest即Representational State Transfer,表现层状态转化
互联网上资源(是服务)细化理解为一个url,如果访问某个资源通过http url访问。
我们把”资源”具体呈现出来的形式,叫做它的”表现层”(Representation)
表现层对用户展示的形式:html、json、xml、pdf、图片。。
由于http协议的限制,服务器和客户端不能实现主动通信,只能有客户端发起请求服务端响应请求,也就是将请求方法和参数都包含url,
使用rest和不使用rest的规则都是这样做的,但是rest对于url做了很好的规划,这个规则将方法和资源分开看起来做的很简单,但是却使我们更好理解了,上网无非就是对于网络资源的操作,网络资源在internet中直白点说就是url(个人理解)所以如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是”表现层状态转化”。
GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源
log4j的配置
创建log4j.properties
修改mybtais.xml让mybtis使用log4j的日志输出
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
web.xml的配置
什么是mybatis
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录.
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
orm工具的基本思想
1. 从配置文件(通常是XML配置文件中)得到 sessionfactory.
2. 由sessionfactory 产生 session
3. 在session 中完成对数据的增删改查和事务提交等.
4. 在用完之后关闭session 。
5. 在Java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。
Mapper :定义了对应的数据库操作的语句,完成对数据库的不同操作进隔离(区分)
Namespace属性=“自定义”
DML操作标签:isnert,update,delete 定义了数据库的具体dml操作。
id属性=”自定义”,用来namespace.id 获得对应的Statement对象(sql)
parameterType=“Mapper接口中方法形参的完全限定名”
DQL操作标签:select 定义具体的DQL操作
resultType属性=“Mapper接口中方法的返回值的完全限定名,集合指定集合
中元素的类型”
1、面向接口编程:
好处:扩展性好,分层开发中,上层不用管具体的实现,大家都遵循共同的标准,使得开发变得容易。规范性更好
2、注解的实现:
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
什么是逆向工程
MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。
使用逆向工程
使用MyBatis的逆向工程,需要导入逆向工程的jar包,我用的是mybatis-generator-core-1.3.2.jar,下面开始总结一下MyBatis逆向工程的使用步骤。
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官方文档说的愿景是成为 Mybatis 最好的搭档,就像 魂斗罗 中的1P、2P,基友搭配,效率翻倍。
特性
无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有
Mybatis 原生的特性
依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击
通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。
服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
优点是在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。
缺点是无法作废已颁布的令牌/不易应对数据过期。
可能习惯了redis保存session,使用shiro做登陆,突然使用JWT有点不适应,因为太简单了,
我个人不是很建议使用,还是那句话,你的选择权有多大,你有学多少知识。
概念介绍
JWT消息构成
一个token分3部分,按顺序为
头部(header)
其为载荷(payload)
签证(signature)
由三部分生成token
3部分之间用“.”号做分隔。例如
Jwt的头部承载两部分信息:
声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
JWT里验证和签名使用的算法,可选择下面的。
互联网服务离不开用户认证
1.向服务器发送用户名和密码
2、服务器认证通过后,在当前会话中(session)里面保存相关数据,比如用户角色登录时间,等等
3、服务器向用户返回一个session_id,写入用户的cookie
4.用户随后的每一次请求,都会通过Cookie,将session_id传回服务器。
5.服务器收到session_id,找到前期保存的数据,由此得到用户的身份.
这种模式的问题在于,扩展性不好,单机当然没有问题,如果是服务器集群,或者是服务器跨域导向架构,就要求session数据共享,每台服务器读取session数据。
举例来说,A网站和B网站是同一家公司的关联。现在要求,用户只在一家公司网站上登陆,再访问另一个网站就会自动登录,请问怎么实现。
一种解决方案是session数据持久化,写入数据库或别的持久层。各服务收到请求后,都向持久层请求数据。这种方案的优点是结构清晰,缺点是工程量较大。另外
持久层挂了,就会单点失败。
另一种方案就是服务器索性不保存session数据。所有的数据都保存到客户端,每次请求都发回服务器。JWT就是这种方案的代表。
用户与服务端通信的时候,都需要发回这个JSON对象,服务器完全只靠这个对象认定用户身份,为了防止用户篡改数据,服务器在生成对象的时候,会加上签名。
JWT 的使用方式
客户端收到服务器返回的JWT,可以存储到Cookie里面,也可以储存在 localStorage。
此后,客户端每次与服务器之间通信,都要带上这个JWT。你可以把它放在Cookie里面自动发送,但是这样不能跨域。所以更好的做法是放在HTTP请求的头信息
Authorization 字段里面。
另外一种做法是,跨域的时候,JWT就放在POST请求数据里面。
JWT几个特点
JWT默认是不加密的,
playload