做项目中,好的逻辑,代码
1. 将不经常改变的数据放在redis缓存中(自动的排序)
public class CategoryServiceImpl implements CategoryService {
private CategoryDao categoryDao = new CategoryDaoImpl();
@Override
public List<Category> findAll() {
//1.从redis中查询
//1.1获取jedis客户端
Jedis jedis = JedisUtil.getJedis();
//1.2可使用sortedset排序查询
//Set<String> categorys = jedis.zrange("category", 0, -1);
//1.3查询sortedset中的分数(cid)和值(cname)
Set<Tuple> categorys = jedis.zrangeWithScores("category", 0, -1);
List<Category> cs = null;
//2.判断查询的集合是否为空
if (categorys == null || categorys.size() == 0) {
System.out.println("从数据库查询....");
//3.如果为空,需要从数据库查询,在将数据存入redis
//3.1 从数据库查询
cs = categoryDao.findAll();
//3.2 将集合数据存储到redis中的 category的key
for (int i = 0; i < cs.size(); i++) {
jedis.zadd("category", cs.get(i).getCid(), cs.get(i).getCname());
}
} else {
System.out.println("从redis中查询.....");
//4.如果不为空,将set的数据存入list
cs = new ArrayList<Category>();
for (Tuple tuple : categorys) {
Category category = new Category();
category.setCname(tuple.getElement());
category.setCid((int)tuple.getScore());
cs.add(category);
}
}
return cs;
}
}
逻辑:
1. 查看redis中是由有需要的数据
* 没有, 从Mysql中查询,后存放到redis中,返回
* 有,从redis中获取,转为list后,返回
2. 分页栏的显示的个数,始终保证在10个(仿百度的效果)
前台的分页栏进行优化
// 定义开始位置begin,结束位置 end
var begin; // 开始位置
var end ; // 结束位置
//1.要显示10个页码
if(pb.totalPage < 10){
//总页码不够10页
begin = 1;
end = pb.totalPage;
}else{
//总页码超过10页
begin = pb.currentPage - 5 ;
end = pb.currentPage + 4 ;
//2.如果前边不够5个,后边补齐10个
if(begin < 1){
begin = 1;
end = begin + 9;
}
//3.如果后边不足4个,前边补齐10个
if(end > pb.totalPage){
end = pb.totalPage;
begin = end - 9 ;
}
}
var li=''; // 进行拼接字符串使用 单引号
for (var i = begin; i <= end ; i++) {
// 进行分页栏的相同代码进行拼接
}
3. 分页查询同过condition的map集合进行拼接sql (多用,实际)
pageBean对象
int currentPage ; // 当前页
int pageSize ; // 每页的数据的个数
int totalPage ; // 总的页数
int totalCount ; // 总的数据的个数
List<User> userList ; // 数据的信息
公式:
int start = (currentPage -1 ) * pageSize;
totalPage = totalCount % pageSize > 0 ? (totalCount / pageSize) +1 : totalCount / pageSize
查询总的数据的个数
int findCountByCondition(map<String , Strin[]>condition){
//这里是主要进行sql的拼接
String sql = "select * from tab_user where 1=1 " ; // 拼接的时候,空格
StringBuidler sb = new StringBuilder(sql);
List<Object> list = new ArrayList<>();
Set<String> keyset = condition.keyset();
for(String key : keyset){
if("currerntPage".equals(key) || "PageSize".equals(key) ){
// limit用的不进行sql拼接
continue;
}
String value = map.get(key)[0];
if(value != null || !"".equals(values) ){
sb.append(" and "+key+" like ? "); // 条件查询,使用like
list.add("%"+value+"%");
}
}
int count = jdbcTemplate.qeuryForObeject(sb.tostring(),Integer.class,list.toArray());
return count;
}
PageBean findPageBeanByCondition(Map<String ,String[]>condition,int start ,int pageSize){
String sql = "select * from tab_user where 1=1 " ; // 拼接的时候,空格
StringBuidler sb = new StringBuilder(sql);
List<Object> list = new ArrayList<>();
Set<String> keyset = condition.keyset();
for(String key : keyset){
if("currerntPage".equals(key) || "PageSize".equals(key) ){
// limit用的不进行sql拼接
continue;
}
String value = map.get(key)[0];
if(value != null || !"".equals(values) ){
sb.append(" and "+key+" like ? "); // 条件查询,使用like
list.add("%"+value+"%");
}
}
sb.append(" limit ?,?");
list.add(start);
list.add(pageSize);
List<User> userList=
jdbcTemplate.query(sb.tostring(),new BeanPoopertoes<>(User.class),list.toArray());
return userList;
}
4. 乱码的转换
String rname = req.getParama("rname"); // 如果是乱码
alter(rname);
rname = new String(rname.getByte("iso-8859-1"),"utf-8");
alter(rname);
5. 从location中拿到参数的数据
location.seach
页面1 index。html
<a href = "index2.html?cid=5">点击进行跳转</a>
index2.html
<script>
$(function(){
var search = location.search;
//alert(search);//?id=5
// 切割字符串,拿到第二个值
var cid = search.split("=")[1]; // 5
});
</script>
6. 表单的验证
提升用户体验,并减轻服务器压力
//校验用户名
//单词字符,长度8到20位
function checkUsername() {
//1.获取用户名值
var username = $("#username").val();
//2.定义正则
var reg_username = /^\w{8,20}$/;
//3.判断,给出提示信息
var flag = reg_username.test(username);
if(flag){
//用户名合法
$("#username").css("border","");
}else{
//用户名非法,加一个红色边框
$("#username").css("border","1px solid red");
}
return flag;
}
//校验密码
function checkPassword() {
//1.获取密码值
var password = $("#password").val();
//2.定义正则
var reg_password = /^\w{8,20}$/;
//3.判断,给出提示信息
var flag = reg_password.test(password);
if(flag){
//密码合法
$("#password").css("border","");
}else{
//密码非法,加一个红色边框
$("#password").css("border","1px solid red");
}
return flag;
}
//校验邮箱
function checkEmail(){
//1.获取邮箱
var email = $("#email").val();
//2.定义正则 [email protected]
var reg_email = /^\w+@\w+\.\w+$/;
//3.判断
var flag = reg_email.test(email);
if(flag){
$("#email").css("border","");
}else{
$("#email").css("border","1px solid red");
}
return flag;
}
$(function () {
//当表单提交时,调用所有的校验方法
$("#registerForm").submit(function(){
return checkUsername() && checkPassword() && checkEmail();
//如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交
});
//当某一个组件失去焦点是,调用对应的校验方法
$("#username").blur(checkUsername);
$("#password").blur(checkPassword);
$("#email").blur(checkEmail);
});
7.优化Servlet 变成SpringMvc的访问路径
BaseServlet extends HttpServlet // 所以BaseServlet 就是一个servlet
UserServlet extends BaseServlet // BaseServlet 重写service方法
//谁调用我?我代表谁
System.out.println(this);//UserServlet的对象 cn.itcast.travel.web.servlet.UserServlet@4903d97e
访问的路径:/user/add 访问的是userServlet后,会自动的调用service()方法
service()方法是继承BaseServlet的。
BaseServlet
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("baseServlet的service方法被执行了...");
//完成方法分发
//1.获取请求路径
String uri = req.getRequestURI(); // /travel/user/add
System.out.println("请求uri:"+uri);// /travel/user/add
//2.获取方法名称
String methodName = uri.substring(uri.lastIndexOf('/') + 1); // add
System.out.println("方法名称:"+methodName);
//3.获取方法对象Method
//谁调用我?我代表谁
System.out.println(this);//UserServlet的对象 cn.itcast.travel.web.servlet.UserServlet@4903d97e
try {
//获取方法
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//4.执行方法
//暴力反射
//method.setAccessible(true);
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
userservlet
@WebServlet("/user/*") // /user/add /user/find
public class UserServlet extends BaseServlet {
/**
* 注册功能
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 注意:这里的方法必须为public
}
/**
* 登录功能
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* 查询单个对象
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void findOne(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* 退出功能
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* 激活功能
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
进行拦截路径
继承拦截器
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
String[] noNeedAuthPage = new String[]{
"/home",
"/searchProduct",
"/sortProduct",
"/showProduct",
"/loginPage",
"/login",
"/registerPage",
"/register",
"/registerSuccessPage",
"/test",
"/checkLogin",
"/admin"
};
String uri = request.getRequestURI();
if (!Arrays.asList(noNeedAuthPage).contains(uri)) {
User user = (User) session.getAttribute("user");
if (null == user) {
response.sendRedirect("/loginPage");
return false;
}
}
return true;
}