前端項目總結redis,jedis,BaseServlet,反射

redis

redis特點:

  1. redis命令是nosql的,什麼是nosql:
    不按照標準規定的sql語句來操作數據庫
  2. redis能把數據存在內存中(eg:將數據庫中的數據存在內存中,防止再次查詢數據時消耗大量的資源和時間)
							  數據庫中的信息
								uid  uname
								 1	  呵呵
								 2    小黃
								 3    小明
《--------------------------------------------------------------------//1.從redis中查詢
        //1.1獲取jedis客戶端
        Jedis jedis = JedisUtil.getJedis();
        //1.2可使用sortedset排序查詢
        Set<String> categorys = jedis.zrange("category", 0, -1);
        System.out.println(categorys);
        //2.判斷查詢的集合是否爲空
        List<Category> list = null;
        if (categorys==null || categorys.size()==0){
            //3.如果爲空,從數據庫查詢,再將數據庫存入redis
            //3.1從數據庫查詢
            list = categoryDao.findAll();
            //3.2將集合數據存到redis中的 catefory的key
            for (int i = 0; i < list.size(); i++) {

                jedis.zadd("category",list.get(i).getCid(),list.get(i).getCname());

            }

jedis

操作redis的一個jar包
下面的連接工具其實是爲了有更好的代碼體驗

其實可以只需要創建
public Jedis() {
 }

 public Jedis(String host) {
     super(host);
 }

 public Jedis(String host, int port) {
     super(host, port);
 }

 public Jedis(String host, int port, int timeout) {
     super(host, port, timeout);
 }

 public Jedis(String host, int port, int connectionTimeout, int soTimeout) {
     super(host, port, connectionTimeout, soTimeout);
 }
package cn.itcast.travel.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Jedis工具類
 */
public final class JedisUtil {
    private static JedisPool jedisPool;

    static {
        //讀取配置文件
        InputStream is = JedisPool.class.getClassLoader().getResourceAsStream("jedis.properties");
        //創建Properties對象
        Properties pro = new Properties();
        //關聯文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //獲取數據,設置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));


    }


    /**
     * 獲取連接方法
     */
    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

    /**
     * 關閉Jedis
     */
    public static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }
}

BaseServlet

由於Servlet寫多了之後會出現代碼冗餘等問題,所以就可以直接通過一個路徑名來調用方法,達到簡化代碼的效果
BaseServlet的實現其實是:反射
CategoryServlet類 extends BaseServlet輸入的方法名會加入在路徑後面,反射就可以獲取這個名字,通過這個名字來調用CategoryServlet類方法

其次反射中如果用暴力反射,就要加上

method.setAccessible(true);

什麼是暴力反射呢?
getDeclaredMethod(String name,...obj.class(可以爲空)):獲取該名類的所有方法

Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
package cn.itcast.travel.web.servlet;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.獲取請求路徑
        String uri = req.getRequestURI();
//        System.out.println("UserServlet路徑:"+uri);//  /travel/user/add
        //2.獲取方法名
        String methodName = uri.substring(uri.lastIndexOf('/') + 1);//add
//        System.out.println(methodName);
        //3.獲取方法對象Method
        //誰調用我,this就是誰
//        System.out.println(this);
        try {
            //忽略權限修飾符,獲取方法對象
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //暴力反射
            //4.執行方法
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

package cn.itcast.travel.web.servlet;

import cn.itcast.travel.domain.Category;
import cn.itcast.travel.service.CategoryService;
import cn.itcast.travel.service.impl.CategoryServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/category/*")
//繼承於BaseServlet 
<------------------------------------------------------------------>
//當訪問這個路徑時候就會給與findAll方法名
<------------------------------------------------------------------>
//例如/category/findAll
public class CategoryServlet extends BaseServlet {

    private CategoryService service = new CategoryServiceImpl();

    /**
     * 查詢所有
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    public void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.調用service查詢所有
        List<Category> cs = service.findAll();
        //2.序列化json返回
       /* ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString("cs");*/
       writerValue(cs,response);


    }
}

req.getRequestURI與req.getContextType區別

//1.獲取請求的URI路徑
        String uri = req.getRequestURI();
        輸出:/travel/user/add
//2.獲取請求的虛擬路徑
		String contentPath = req.getContextType();
		輸出:/travel
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章