一、常用注解
@Path
- 标注class时,表明该类是个资源类,凡是资源类必须使用该注解
- 标注method时,表示具体的请求资源的路径
@Consumes
#### 指定HTTP请求的MIME类型,默认是*/*,表示任意的MIME类型。该注解支持多个值设定,可以使用MediaType来指定MIME类型。
MediaType的类型大致有:
application/xml
application/atom+xml
application/json
application/svg+xml
application/x-www-form-urlencoded
application/octet-stream
multipart/form-data
text/plain
text/xml
text/htm
- 例子:
@Consumes({ MediaType.APPLICATION_FORM_URLENCODED }) //APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded"
@Produces
- 指定HTTP响应的MIME类型,默认是*/*,表示任意的MIME类型。同Consumes使用MediaType来指定MIME类型。
- 注解位置:方法注解
@Produces({ MediaType.APPLICATION_JSON }) //APPLICATION_JSON = "application/json"
@PathParam
- 配合@Path进行使用,可以获取URI中指定规则的参数。
- 注解位置:参数注解
@QueryParam
- 用于获取GET请求中的查询参数,实际上是url拼接在?后面的参数。
- 注解位置:参数注解
@FormParam
- 用于获取POST请求且以form(MIME类型为application/x-www-form-urlencoded)方式提交的表单的参数。
- 注解位置:参数注解
@FormDataParam
- 用于获取POST请求且以form(MIME类型为multipart/form-data)方式提交的表单的参数,通常是在上传文件的时候。
- 注解位置:参数注解
@Context
- 用来用来解析上下文参数,和Spring中的AutoWired效果类似。通过该注解可以获取ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等信息。
- 注解位置:属性注解,参数注解
@Path("/user")
public class Resource {
@Context
HttpServletRequest req;
@Context
ServletConfig servletConfig;
@Context
ServletContext servletContext;
@GET
public String get(@Context HttpHeaders hh) {
MultivaluedMap<String, String> headerParams = hh.getRequestHeaders();
Map<String, Cookie> pathParams = hh.getCookies();
}
}
@Around简单使用示例——SpringAOP增强处理
@Around的作用
既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;
可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;
可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值; 当需要改变目标方法的返回值时,只能使用Around方法;
@Modifying
涉及到数据修改操作,可以使用 @Modifying 注解, @Query 与 @Modifying 这两个 annotation一起声明,可定义个性化更新操作,例如涉及某些字段更新时最为常用,示例如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2XVsFsL-1671693816926)(C:\Users\PC\AppData\Roaming\Typora\typora-user-images\image-20221208181959103.png)]
javax的PrePersist注解
可以用来在使用jpa的时记录一些业务无关的字段,比如最后更新时间等等
二、SMSSDK短信验证
三、sql语句另一种写法
@ReturnGeneratedKey
@Query("insert into tb_user(account_name, password, uid, nick_name, register_time, update_time) " +
"values(:user.accountName, :user.password, :user.uid, :user.nickName, :user.registerTime, :user.updateTime )")
public int saveUser(@Param("user") User user);
https://zhuanlan.zhihu.com/p/369953316
四、Jersey+Spring+Hibernate整合
https://blog.csdn.net/wangqyoho/article/details/51981954
pom 添加以下依赖配置
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.ws.rs/jsr311-api -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.11.Final</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-aspects</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-instrument</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-jdbc</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-web</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>
<!-- commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-server -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.23</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.containers/jersey-container-servlet -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.23</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.23</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.ext/jersey-spring3 -->
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.23</version>
</dependency>
</dependencies>
创建web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<!-- 加载application -->
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>cn.wqy.BookResourceConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
spring配置文件applicationContext.xml:
<!-- 配置使用注解,仅仅配置这一项的话还是需要在XML文件中进行bean配置 -->
<context:annotation-config />
<!-- 让容器到指定包目录下寻找需要被当做组件的类 ,其中包含了context:annotation-config的功能,因此有scan时可以省略上一条-->
<context:component-scan base-package="cn.wqy" />
<!-- 事务管理******************************************************************************************** -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 创建数据源***************************************************************************************** -->
<context:property-placeholder location="classpath:jdbc.properties" /><!--
classpath表示src目录下的properties文件 -->
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 创建SessionFactory,并注入数据源********************************************************************* -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="DataSource" ref="myDataSource" />
<property name="annotatedClasses">
<list>
<value>cn.wqy.model.Book</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- 创建hibernateTemplate********************************************************************************** -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
创建Resource类
package cn.wqy.resource;
import javax.annotation.Resource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.springframework.stereotype.Component;
import cn.wqy.model.Book;
import cn.wqy.service.BookService;
@Path("books")
@Component
public class BookResource {
private BookService bookService;
public BookService getBookService() {
return bookService;
}
@Resource
public void setBookService(BookService bookService) {
this.bookService = bookService;
}
@GET
@Path("/test1")
@Produces(MediaType.APPLICATION_JSON)
public Book getUserJSON() {
Book book = new Book();
book.setId(4);
book.setBookName("wqy");
book.setPublisher("yyq");
return book;
}
@GET
@Path("/test2")
@Produces(MediaType.APPLICATION_XML)
public Book getUserXML() {
Book book = new Book();
book.setId(4);
book.setBookName("wqy");
book.setPublisher("yyq");
return book;
}
@GET
@Path("{id:[0-9]*}")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Book getBooks(@PathParam("id") final int id) {
final Book book = this.bookService.getById(id);
return book;
}
}
创建service、dao、model类
创建Application类,注册服务
其中可以通过@ApplicationPath注解定义入口,并且其中通过packages方法配置了Resource资源类的定位
package cn.wqy;
import org.glassfish.jersey.server.ResourceConfig;
//import javax.ws.rs.ApplicationPath;
//@ApplicationPath("/webapi/*")
public class BookResourceConfig extends ResourceConfig {
public BookResourceConfig() {
// TODO Auto-generated constructor stub
packages("cn.wqy.resource");
}
}
创建jsp以及js文件
五、session-config session-timeout
session-config元素为Web应用中的javax.servlet.http.HttpSession对象定义参数。session-timeout元素用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果session-timeout元素的值为零或负数,则表示会话将永远不会超时。
下面是一个部署描述符,在用户最近访问HttpSession对象30分钟后,HttpSession对象默认为无效:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
六、synchronized(this)总结
https://blog.csdn.net/qq_39312683/article/details/80982053
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
时时间间隔,以分钟为单位。该元素值必须为整数。如果session-timeout元素的值为零或负数,则表示会话将永远不会超时。
下面是一个部署描述符,在用户最近访问HttpSession对象30分钟后,HttpSession对象默认为无效:
30
## 六、synchronized(this)总结
https://blog.csdn.net/qq_39312683/article/details/80982053
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。