Javaweb 注解开发

开发规范:Restful

    get:查询
    post:新增
    put:修改
    delete:删除
rest:Representational state transfer表述性状态转换,一种软件架构风格,通常加s

注解:
    日志注解:@Slf4j
        //private static Logger log= LoggerFactory.getLogger(DeptController.class);
        log.info("查询全部部门数据");


    @ResponseBody会自动转数据为json

    @RequestMapping(value = "/depts",method = RequestMethod.GET) = @GetMapping("/depts")
    @RequestParam(defaultValue=)

    @PathVariable路径接收注解,位置在方法形参中
    @RequestBody实体类接收注解 一般post/put请求

    @DateTimeFormat(pattern = "yyyy-MM-dd")

    @Value注解 用于外部配置属性注入 @Value("${配置文件中的key}") 加在属性上就行,配合@Component

配置文件自动注入
    要求:
        key值的后缀和属性名一致
        提供get/set方法(@Date)
        交给ioc管理(@Component)
        使用类注解@ConfigurationProperties(prefix="前缀")批量注入
        引入依赖(可以不引入,提供配置文件中的提示):
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-configuration-processor</artifactId>
                    </dependency>


多列编辑:alt shift 左键或者alt 左键拖动


properties文件字符串不加引号,不要空格
    server.port=8080
    server.address=127.0.0.1
springboot yml配置文件:application.yml
    server:
        port: 8080
        address: 127.0.0.1
    yml基本语法:
        大小写敏感
        数值前必须有空格,作为分隔符
        使用缩进表示层级关系,缩进是空格(idea会转Tab为空格)
        缩进空格数目不重要,对齐就行
        #注释
    yml定义对象/Map集合
        user:
            name: Tom
            age: 18
            password: 123456
    定义数组/List/Set集合
        hobby:
            -java
            -game
405:请求方式不允许

分页查询:
    配置依赖

            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.4.7</version>
            </dependency>
前端页面放在static中

文件上传

    1.前端页面三要素
        表单项type="file"
        表单提交方式post
        表单的enctype属性multipart/form-data
    2.服务端接收文件
        MultipartFile
文件上传:本地存储
    在服务端,接收到上传的文件之后,将文件存储到本地服务器磁盘中
    uuid:通用唯一识别码
    public ResultVO upload(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传");
        //获取原始文件名
        String oldName = image.getOriginalFilename();
        int index = oldName.lastIndexOf(".");
        String subName = oldName.substring(index);
        final String uuid = UUID.randomUUID().toString();
        String newName = uuid + subName;
        //将接收的文件转存到磁盘文件中
        image.transferTo(new File("D:\\Users\\JavawebCode\\web二期\\Javaweb\\tlias-web-management\\file\\" + newName));
        //getSize()获取文件大小 字节
        //getBytes()获取文件内容的字节数组
        //getInputStream()获取接收到的文件内容的输入流
        return ResultVO.success();
    }
#配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大大小限制(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
 

登录认证

    登录标记:用户登录成功后,每一次请求中,都可以获取到该标记
    统一拦截:过滤器Filter(servlet提供)
            拦截器Interceptor(springboot提供)
    会话技术:浏览器与服务器的一次连接称一次会话,打开浏览器,访问服务器,会话建立,直到一方断开连接,会话结束(一次会话可以包含多个请求与响应)
    会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一会话的多次请求中共享数据
        会话跟踪方案:
            客户端会话跟踪技术:cookie 存储在浏览器本地,http支持 响应头setCookie ,请求头携带cookie

            服务器会话跟踪技术:session 存储在服务器,基于cookie实现,通过id获取session

            令牌技术:服务器生成,客户端存储令牌
JWT:json web token 定义了简洁的(本质是字符串)、自包含(可以存储自定义信息)的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,信息安全。
    组成:头.有效载荷.签名
        头Header:记录令牌类型,签名算法
        有效载荷Payload:携带自定义信息、默认信息(令牌的有效期、签发日期等)等
        签名Signature:防止token被篡改,确保安全。将header、payload,并入指定密钥,通过签名算法计算而来
        json通过Base64编码成字符串
    场景:登录认证
        登陆成功后生成令牌
        后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,在处理
    生成:
        引入依赖
        <!--        JWT令牌-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
    private static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    private static String secretKey = "itheima";
    private static Long expires = 43200000L;

    public static String generatorJwt(Map<String, Object> claims) {
        String jwt = Jwts.builder()
                .signWith(signatureAlgorithm, secretKey)
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + expires))
                .compact();
        return jwt;
    }

    public static Claims parseJwt(String jwt) {
        Claims claims = Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }

过滤器(Filter)

    javaweb的三大组件之一(Servlet、Filter、Listener)
    过滤器可以把对资源的请求拦截下来
    应用场景:登录校验、统一编码处理、敏感字符处理等
    使用:
        实现Filter接口,实现doFilter方法
        配置@WebFilter(urlPattern="")
        引导类(启动类):@ServletComponentScan 开启对javaweb(servlet)组件的支持
    过滤器链:注解配置的Filter,优先级按照过滤器类名进行排序


import com.alibaba.fastjson.JSONObject;
import com.example.config.ResultVO;
import com.example.utils.JWTUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) request;
        HttpServletResponse resp=(HttpServletResponse) response;
        //1.获取请求url
        final String url = req.getRequestURL().toString();
        log.info("请求的url:{}",url);

        //2.解析url,判断是否包含login,如果包含,放行
        if(url.contains("login")){
            log.info("登录操作,放行");
            chain.doFilter(request,response);
            return;
        }
        //3.获取请求头中的令牌(token)
        final String jwt = req.getHeader("token");
        //4.判断令牌是否存在
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头token为空,返回未登录的信息");
            ResultVO error=ResultVO.error("NOT_LOGIN");
            //手动转换 对象-->json 阿里巴巴fastjson
            final String notLogin= JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }
        //5.解析token
        try {
            JWTUtils.parseJwt(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析jwt令牌失败,返回未登录的信息");
            ResultVO error=ResultVO.error("NOT_LOGIN");
            //手动转换 对象-->json 阿里巴巴fastjson
            final String notLogin= JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        //6.放行
        log.info("令牌合法,放行");
        chain.doFilter(request,response);
    }
}
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

拦截器(Interceptor)

    一种动态拦截方法调用机制,类似于过滤器。Spring框架中提供,用来动态拦截控制器中方法的执行
    使用:
        1.定义拦截器,实现HandlerInterceptor接口,交给IOC
        2.注册拦截器,实现WebMvcConfigurer接口,addInterceptors方法
    拦截路径:
        /*一级路径
        /**任意路径
        /dept/* /dept下一级,不包含
        /dept/**    /dept下的所有,包含

全局异常处理器

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)//捕获所有异常
    public ResultVO ex(Exception ex){
        ex.printStackTrace();
        return ResultVO.error("操作失败");
    }
}

Other 

@ResponseBody
类型:方法注解、类注解
作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将转换为json
说明:@RestController=@Controller+@ResponseBody

html文件放于static中,public或resource

三层架构
    controller接收前端发送的请求,对请求进行处理并响应数据
    service
    dao:Data Access Object数据访问层,数据增删改查
内聚 耦合
    内聚:软件中各个功能模块内部功能联系
    耦合:衡量软件中各个层/模块之间的依赖、关联程度
控制反转:Inversion Of control 简称IOC。对象的创建控制权由程序自身转移到外部(容器),称控制反转
    @Component 将当前类交给IOC容器管理,成为IOC容器中的bean
    @Component的衍生注解
        @Controller(@RestController=@ResponseBody+@Controller)
        @Service
        @Repository
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称依赖注入
    @Autowired 依赖注入 默认按类型自动装配
    如果同类型的bean存在多个:
        类注解@Primary声明优先级
        @Autowired+@Qualifier("bean的名称")
        @Resource(name="bean的名称")
    @Resource和@Autowired区别
        @Autowired是spring框架提供的注解,而@Resource是JDK提供的注解
        @Autowired默认按类型进行注入,而@Resource默认按名称进行注入
Bean对象:IOC容器中创建、管理的对象,称为Bean

@SpringBootApplication默认扫描当前包及其子包
手动包扫描:@ComponentScan({"dao","com.example"})

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值