1. 程式人生 > >整理下最近OA系統和許可權系統書寫過程中的部分收穫

整理下最近OA系統和許可權系統書寫過程中的部分收穫

一.業務開發中的各類註解

 

1.lombok包下的實體類註解包括@Data,@AllArgsConstructor,@NoArgsConstructor,提供了get,set,toString,全參構造和無參構造的方法。

2.javax.persistence下的@entity,@Table,@column,@id,@GeneratedValue等直接完成了實體類到資料庫表的對映,可以省去書寫*.hbm.xml檔案的步驟。

[email protected],@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通訊

 

四.總結

人生第一份正式的工作,經過兩個月的工作和學習終於能很好的上手專案了。後面的路道阻且長,相信只要堅持下去應該就會有應得的回報。