1.导入静态资源?首页?jsp?模板引擎
1.1什么是web jars?
WebJars是将web前端资源(js,css等)打成jar包文件,然后借助Maven工具,以jar包形式对web前端资源进行统一依赖管理,保证这些Web资源版本唯一性。WebJars的jar包部署在Maven中央仓库上。
结论:resources下的文件均可访问(但是直接放在resources文件的根目录下不可以!!!)
resource>public>static;
1.2首页如何定制
-
将index.html放到静态资源目录下。
-
通过controller调用(需要模板引擎thymeleaf)
-
在依赖中添加:
-
<dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId> </dependency>
-
-
在html中添加:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
-
1.3模板引擎
将放在templates中的HTML页面进行解析。
- 通过th标签+元素名在前段和后端之间传输数据。
- 语法和Vue类似
<h3 th:each="friend:${friends}" th:text="${friend.getName()}"></h3>
1.4UI框架:Bootstrap
1.5 网页的国际化:
1)配置i18n文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ot8k4j6p-1616314948547)(/Users/yuanbao/Library/Application Support/typora-user-images/image-20210316202914834.png)]
通过这个页面进行语言转换。
2)通过后端更改文件语言
<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
/**
* 解析请求
*/
public Locale resolveLocale(HttpServletRequest request) {
//获取语言请求
String language = request.getParameter("l");
Locale locale = Locale.getDefault();
//如果语言不为null则使用请求的语言体系
if (!StringUtils.isNullOrEmpty(language)){
String split[] = language.split("_");
locale = new Locale(split[0], split[1]);
}
return locale;
}
3)将自己写的组件配置到spring容器中
//自定义的国际化组件就生效了!
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolve();
}
2.装配拓展SpringMVC
2.1Spring MVC自动配置
POJO是Plain Ordinary Java Objects的缩写不错,但是它通指没有使用Entity Beans的普通java对象,可以把POJO作为支持业务逻辑的协助类。
2.2 实现登录–未连接数据库
1)通过thymeleaf做url请求
<form class="form-signin" th:action="@{/user/login}">
2)在对应的url请求的controller中进行业务处理
@RequestMapping("/user/login")
// @ResponseBody
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Model model){
//具体的业务
if (!StringUtils.isNullOrEmpty(username)&&"1111".equals(password)){
return "redirect:/main.html";
}else {
model.addAttribute("msg","用户名或密码错误!");
return "index";
}
}
3)在WebMvcConfigurer中进行页面地址映射
@Override
//做页面映射!!!
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
2.3 实现拦截器功能
1)自定义拦截器
实现接口HandlerInterceptor(集成抽象类AbstracInterceptor)
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录成功之后,应该有用户的session
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser==null){
request.setAttribute("msg", "没有权限请先登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else {
return true;
}
}
}
添加拦截器后,对于controller的url必须允许访问(不要把自己拦截了!)!!!
2)在MVCConfig中注册
//添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login","/css/*","/js/*","/img/*");
}
3.连接数据库(增删改查)
3.1)连接数据库–原始
对于数据访问层,无论是SQL还是NOSQL,SpringBoot均采用SpringData的方式进行统一处理。
在application.yaml中进行配置数据库连接:
# 数据库的连接
spring:
datasource:
username: root
password: Fxk199959
url: jdbc:mysql://localhost:3306/BdAP?userUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver
1.spring数据源–hikari:
2.获得数据库连接connect
3.进行增删改查
java自带的statement接口
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。
try {
Connection connection = dataSource.getConnection();
ResultSet rs = null;
Statement statement = connection.createStatement();
String sql = "select * from User_message";
rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getString(2));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
通过JdbcTemplate(自带的类)进行增删改查的工作:
JdbcTemplate template = new JdbcTemplate(dataSource);
String sql = "select * from User_message where user_name='傅显坤' and user_password='123456'";
System.out.println(template.queryForList(sql));
JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
3.2)整合Druid–阿里优化的数据库连接池
Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池。
整合到spring中;
<!-- druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
#切换数据源
type: com.alibaba.druid.pool.DruidDataSource
druid:
test-on-borrow: true
test-while-idle: true
3.3)整合mybatis
Mybatis框架是一个开源的持久层框架,它对传统的JDBC操作数据库的方法做了进一步的封装,使用时不需要我们程序猿自己来创建连接、释放连接等操作。只需配置好mybatis的配置文件就可以灵活使用了。
-
导入包
<!-- 整合mybatis --> <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
-
配置文件
# 数据库的连接 spring: datasource: username: root password: Fxk199959 url: jdbc:mysql://localhost:3306/BdAP?userUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 整合mybatis mybatis: type-aliases-package: com.fxk.badp.pojo mapper-locations: classpath:mybatis/mapper/*xml configuration: map-underscore-to-camel-case: true
-
持久层(mapper)编写接口interface
@Mapper @Repository public interface UserMapper { List<User> queryUserLists(); User queryUsersById(int id); int addUser(User user); int updateUser(User user); int deleteUser(int id); }
-
xml文件编写sql
<mapper namespace="com.fxk.badp.mapper.UserMapper"> <select id="queryUserLists" resultType="User"> select * from User_message </select> <select id="queryUsersById" resultType="User"> select * from User_message where user_id = #{id} </select> <insert id="addUser" parameterType="User"> insert into User_message (user_name,user_id,user_password,user_identity,user_faction) values (#{name},#{id},#{password},#{identity},#{faction}) </insert> <update id="updateUser" parameterType="User"> update User_message set User_name=#{name},user_password={password} where user_id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from User_message where user_id=#{id} </delete> </mapper>
-
service调用接口编写逻辑
@Service public class UserService { @Autowired UserMapper userMapper; public User selectUser(String user_name, String user_password){ return userMapper.selectUser(user_name,user_password); } }
-
controller调用service编写事务
@Controller public class LoginController { @Autowired UserService userService; @RequestMapping("/service/login") // @ResponseBody public String login(@RequestParam("name") String name, @RequestParam("password") String password, Model model, HttpSession httpSession ){ //具体的业务 User user = userService.selectUser(name, password); System.out.println(user); if (user!=null){ // httpSession.setAttribute("loginUserName",user.getUserName()); model.addAttribute("userName", user.getUserName()); return "index"; }else { model.addAttribute("msg", "你的账户或密码错误!请重新输入:"); return "login"; } } }
5.前后端之间的数据交换:
SpringMVC中Model与Session区别
什么是Session:Session:在计算机中,尤其是在网络应用中,称为“会话”。它具体是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。
在网站使用中,为了保存用户信息。服务器会给每一个用户(浏览器)创建一个Session。
流程:
1、客户端请求服务器
2、服务器创建Session,在服务器端保存用户数据
3、服务器返回给客户端一个SessionId(JSESESSION)是一个Cookie
4、用户在Session作用时间内再次访问服务器就会根据SessionId取出用户的Session
Model:Model是一个接口
ModelMap是接口的实现。是将model中的数据填充到request域中,返回给客户端
总结:session数据保存在服务器,model数据放入视图中。session可以在不同页面使用。model只能在Controller返回的页面使用
thymeleaf使用session
<li><a th:if="${#strings.isEmpty(session.userName)}" href="login.html" data-track="true"
data-track-location="header">登录</a>
</li>
<li><a th:if="${#strings.isEmpty(session.userName)}" href="register.html" data-track="true" data-track-location="header"
track-event="Clicked Get Started" class="btn btn-primary navbar-btn">注册</a>
</li>
<li>
<a data-track="true" data-track-location="header">
[[${session.userName}]]
</a>
</li>
6.SpringSecurity
在web中开发中,安全是第一位的!过滤器和拦截器
功能需求:否
设计之初–防止泄露
Spring Security is a powerful and highly customizable authentication(验证) and access-control(访问控制) framework. It is the de-facto standard for securing Spring-based applications.(保护spring框架应用的安全基础!)
- 功能权限:
- 访问权限:
- 菜单权限:
- …拦截器、过滤器:
Aop:面向横向编程;
- WebSecurityConfigureAdapter:自定义Security策略
- AuthenticationManagerBuilder:自定义认证策略
- @EnableWebSecurity:开启WebSecurity模式
SpringSecurity的两个主要目标是”认证“和”授权“;
认证:authentication
授权:authorization
1.config中配置
@EnableWebSecurity
继承WebSecurityConfigurerAdapter类
实现两方法:configure(HttpSecurity http)和configure(AuthenticationManagerBuilder auth)
@Override
//http页面安全问题--授权规则
protected void configure(HttpSecurity http) throws Exception {
//设置有的页面允许所有人访问,有的页面具有特定的角色!
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/getMoney.html").permitAll()
.antMatchers("/backgroundData.html").hasRole("admin");
//没有权限进入登录页面:
http.formLogin().loginPage("/login.html");
//开启注销
http.logout()
.logoutSuccessUrl("/index.html")
.invalidateHttpSession(true);
//关闭跨域访问,解决注销404问题
http.csrf().disable();
}
@Override
//认证的安全问题--认证规则
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//从数据库里读出用户:
// auth.
}
2.防止攻击
跨站请求攻击(CSRF),简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
3.开启记住我功能
config中开启
//记住我功能 cookie
http.rememberMe().rememberMeParameter("remember");
前段参数名为remember:
<div class="form-group">
<input type="checkbox" id="inputRemember" name="remember" checked>
<label for="inputRemember">Remember me</label>
</div>