整理下最近OA系统和权限系统书写过程中的部分收获

一.业务开发中的各类注解

1.lombok包下的实体类注解包括@Data,@AllArgsConstructor,@NoArgsConstructor,提供了get,set,toString,全参构造和无参构造的方法。

2.javax.persistence下的@entity,@Table,@column,@id,@GeneratedValue等直接完成了实体类到数据库表的映射,可以省去书写*.hbm.xml文件的步骤。

3.@service,@controller,@repository,@Component,@autowired等是spring中为三层注释,其操作省略了在spring容器中书写接口实现的步骤和注入的过程。需要在配置文件中书写<context:component-scan/>自动检测指定包下的需要自动注入的bean

4.jpa规范的注解,org.springframework.data.jpa.repository包下,@querry,@modifying。快速完成dao层书写,省略了dao层实现类的书写。@modifying注解需要更改数据库的方法,在spring boot中需要在service层加入@Transactional注解事务,并在启动类中注解@EnableTransactionManagement开启事务注解扫描。

5.接口测试类注解,io.swagger.annotations包下的@API,@ApiOperation,@ApiParam等注解是引入接口框架swagger后,方便前端理解并对接已经写好的接口的注解,省去了接口文档的书写,将接口的目的信息,参数信息等写在具体的实现类中,统一的进行了接口规范管理。

6.controller层的各种注解,@ResponseBody,@RequestMapping,@RequestBody,@RequestParam。@ResponseBody声明将返回数据包装成json,并且返回值不会通过视图解析去找对应页面。@RequestMapping中的value的值是指定访问到当前方法的请求的映射。@RequestBody只能处理post请求,@RequestParam可以处理post和get请求。

二.业务开发中entity,vo,dto类区别与联系

1.entity类是与数据库完成映射的实体类,dao层通过操作entity完成对数据库的操作,是持久化操作的重要载体。

2.vo类是前端与后端对接过程中的重要类,将前端所需要的数据通过查询统一包装到这个类中,以方便前端获取相关信息,以及管理杂乱的数据信息。

3.dto类与vo类的作用相似,但是略有不同。前端与后端交互的vo类通过dto类进行统一的管理。

各个类的区别详:https://blog.csdn.net/zjrbiancheng/article/details/6253232

三.websocket编程

1.注解式开发(tomcat自带的包)

@ServerEndpoint,@OnOpen,@OnMessage,@OnError,@OnClose注解分别是指定websocket请求端点,以及监听websocket的前端发来的连接,通信,异常,关闭请求,然后根据请求进行处理。相关api见:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

2.编程式开发(使用spring-websocket包)

第一步:写一个继承HttpSessionHandshakeInterceptor类的拦截器,websocket的连接请求拦截下来。

public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{  
    @Override  
    public boolean beforeHandshake(ServerHttpRequest request,  
            ServerHttpResponse response, WebSocketHandler wsHandler,  
            Map<String, Object> attributes) throws Exception {  
        return super.beforeHandshake(request, response, wsHandler, attributes);  
    }  
    @Override  
    public void afterHandshake(ServerHttpRequest request,  
            ServerHttpResponse response, WebSocketHandler wsHandler,  
            Exception ex) {   
        super.afterHandshake(request, response, wsHandler, ex);  
    }  
}

第二步,写一个继承TextWebSocketHandler类的 的类,重写监听器。

public class WebsocketEndPoint extends TextWebSocketHandler {  
    Map<Long,Map<UserAuthInfo, WebSocketSession>> users=new HashMap<Long, Map<UserAuthInfo,WebSocketSession>>();
    Map<UserAuthInfo, WebSocketSession> map=new HashMap<UserAuthInfo,WebSocketSession>();
    //收到消息执行后执行
    @Override  
    protected void handleTextMessage(WebSocketSession session,  
            TextMessage message) throws Exception {  
    }
    //连接成功
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        UserAuthInfo info=UserAuthInfoManager.getUserAuthInfo();
        System.out.println(info);
        if(users.get(info.getEmployeeId())==null){
            info.setEmployeeId((Long.parseLong(session.getId())+1));//测试使用
            map.put(info, session);
            users.put(info.getEmployeeId(), map);
            TextMessage msg=new TextMessage(info.getEmployeeName()+"欢迎上线,当前在线人数"+users.size());
            session.sendMessage(msg);
        }else{
            TextMessage msg=new TextMessage("您已连接,请勿重复连接");
            session.sendMessage(msg);
        }
    }
    //收到消息执行先执行
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        UserAuthInfo info=UserAuthInfoManager.getUserAuthInfo();
        
        System.out.println(info.getEmployeeName()+"说:"+message.getPayload());
        session.sendMessage(message);//回显
    }
    //关闭时触发
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        System.out.println("关闭连接");
        UserAuthInfo info=UserAuthInfoManager.getUserAuthInfo();
        users.remove(info.getEmployeeId());
        super.afterConnectionClosed(session, status);
    }

    @Override
    public boolean supportsPartialMessages() {
        System.out.println(4);
        return super.supportsPartialMessages();
    }

    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {
        System.out.println(5);
        super.handleBinaryMessage(session, message);
    }

}

第三步,写一个继承WebSocketConfigurer的类注册拦截器和拦截地址

public class WebsocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler(), "/webSocket").addInterceptors(new HandshakeInterceptor()).
        setAllowedOrigins("http://127.0.0.1:8081"); 
        registry.addHandler(myHandler(), "/webSocket").addInterceptors(new HandshakeInterceptor()).withSockJS() ;

    }
    @Bean
    public WebsocketEndPoint myHandler(){
        return new WebsocketEndPoint(); 
    }
}

第四步,在springMVC配置文件中,将监听类通过切面编程注入到拦截器类中

 <bean id="endPoint" class="com.tz.socket.WebsocketEndPoint"/>
    <websocket:handlers>
    
        <websocket:mapping path="/webSocket" handler="endPoint" />
        <websocket:handshake-interceptors>
            <bean class="com.tz.socket.HandshakeInterceptor" />
        </websocket:handshake-interceptors>
    </websocket:handlers>

如果在springMVC配置了登录拦截的,需要设置过滤掉相关uri。

<mvc:exclude-mapping path="/webSocket"/>

以上两种方式都可以完成简单的websocket编程,然后可以在前端通过 ws://url/websocket 进行websocket通信

四.总结

人生第一份正式的工作,经过两个月的工作和学习终于能很好的上手项目了。后面的路道阻且长,相信只要坚持下去应该就会有应得的回报。

猜你喜欢

转载自blog.csdn.net/kivn_/article/details/81774095