黑马商城05
今日任务:
1.后台页面搭建(了解 听一听)
2.分类展示
3.分类添加
4.分类修改
5.分类删除
1.分类展示
前端:
请求分类数据
for循环追加拼串
后端:
查分类数据并返回
2.分类添加
前端:
请求添加servlet
携带添加的内容
后端:
接收请求
调用插入数据dao
注意:插入完要刷新数据,因为从缓存拿的数据,
mysql和redis里数据不一致,覆盖掉就好了
3.分类修改
修改性的操作 无论修改是啥
都应该包含 两步
1.回显 先把原来的数据给展示出来
注意:
一定带参数 带唯一标识 不要带数据 没意义
2.把新数据提交服务器 完成修改功能
前端:
携带分类id和分类名字向后台查询
后端:
更新数据并刷新redis
4.分类删除
前端:
携带分类id提交给服务器
响应状态为1跳转,响应其他抛异常
后端:
拿到分类id向商品表查询,如果分类表底下没有数据,就删除
如果有数据,就抛出自定义异常
5.使用filter来实现粗和细粒度权限控制
思想:
后端:
粗粒度
加一个过滤器,只要访问这个servlet,就需要登录
细粒度
弄一个配置文件,把不需要登录的servlet,写到配置文件里
粗粒度代码实现:
XAuthFilter
@WebFilter("/order/*")
public class XAuthFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)req;
User user = (User)request.getSession().getAttribute("user");
if(user==null){
ResultVo vo = new ResultVo(ResultVo.CODE_NOLOGIN,"","");
String s = new ObjectMapper().writeValueAsString(vo);
resp.getWriter().print(s);
return;
}
}
}
细粒度代码实现:
auth.properties
order.xx=false
order.generate=true
XAuthFilter
没有写完,大概意思就是读配置文件,然后判断,false不登陆,true登录
String md = request.getParameter("md");
String requestURI = request.getRequestURI();
int i = requestURI.lastIndexOf("/");
String substring = requestURI.substring(i+1);
String str = substring+"."+md;
ResourceBundle str1 = ResourceBundle.getBundle("auth");
String string = str1.getString(str);
System.out.println(string);
6.使用注解来实现方法级别权限控制
思路:
通过注解的方式来判断需不需要登录
注解 Auth.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auth {
String value() default "ROLE_USER";
}
BaseServlet
//判断该方法是否存在@auth的注解
if(method.isAnnotationPresent(Auth.class)){
//存在就需要登录
User user = (User)request.getSession().getAttribute("user");
if(user==null){
nologin();
return;
}
}
7.使用注解属性做更加细粒度的权限控制
思想:
判断注解里的值,来向浏览器返回相应权限的数据
BaseServlet
//判断该方法是否存在@auth的注解
if(method.isAnnotationPresent(Auth.class)){
//存在就需要登录
User user = (User) request.getSession().getAttribute("user");
if (user==null){
nologin();
return;
}
//代码走到这 说明方法是需要登录 且已经登录了
//首先获取注解对象 然后获取它的值
Auth auth = method.getAnnotation(Auth.class);
String role = auth.value();
if (!role.equals(user.getRemark())){
authFail();
return;
}
}
//执行方法
method.invoke(this,request,response);
OrderServlet
@Auth("ROLE_USER")
protected void yy(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("我是需要登录的");
}
@Auth("ROLE_ADMIN")
protected void zz(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("我是需要登录的 还得是管理员");
}
数据库
枚举(了解)
用法:固定的情况,就那几种情况,不会有变动,例子:红绿灯
RoleClass
public class RoleClass {
public static final int LEVEL_GUEST=0;
public static final int LEVEL_USER=1;
public static final int LEVEL_ADMIN=2;
private int level;
//规定 0 游客 1 普通用户 2 管理员
public static final RoleClass GUEST=new RoleClass(0);
public static final RoleClass USER=new RoleClass(1);
public static final RoleClass ADMIN=new RoleClass(2);
private RoleClass() {
}
private RoleClass(int level) {
this.level = level;
}
public int getLevel() {
return level;
}
}
RoleEnum
public enum RoleEnum{
GUEST(0),USER(1),ADMIN(2);
RoleEnum(int level) {
this.level = level;
}
private int level;
public int getLevel() {
return level;
}
}
Demo
public class Demo {
public static void main(String[] args) {
//RoleClass GUEST = new RoleClass(RoleClass.LEVEL_GUEST);
//RoleClass xx = new RoleClass(4);
operate(RoleClass.USER);
operate1(RoleEnum.ADMIN);
}
public static void operate(RoleClass roleClass){
if (roleClass.getLevel()==0){
System.out.println("给10块优惠");
}
if (roleClass.getLevel()==1){
System.out.println("给100块优惠");
}
if (roleClass.getLevel()==2){
System.out.println("给1000块优惠");
}
}
public static void operate1(RoleEnum roleEnum){
if (roleEnum.getLevel()==0){
System.out.println("给10块优惠");
}
if (roleEnum.getLevel()==1){
System.out.println("给100块优惠");
}
if (roleEnum.getLevel()==2){
System.out.println("给1000块优惠");
}
}
}