0%

view、controller、service、dao的理解

  • view:视图,用户看到的东西,后台怎么处理不关心
  • Controller:控制层,也可以成为action(控制视图的跳转),可以调用service层的方法。
  • service:业务逻辑层它向上层contrller提供接口,并且使用dao层提供的接口
  • dao:数据访问对象,dao层里面要完成的是数据访问逻辑以及对数据的访问,dao为上层service提供接口。

你写程序不应该仅仅为实现功能考虑,更多的还是应该为将来的维护考虑,因为大部分的时间还是在维护上的。

BlogMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 映射到接口 -->
<mapper namespace="edu.hziee.mappers.BlogMapper">

<!-- 设置返回结果集的映射 -->
<resultMap id="blogResultMap" type="edu.hziee.models.Blog">
<id property="id" column="id" />
<result property="content" column="content" />
<result property="author" column="author" />
<result property="title" column="title" />
</resultMap>

<select id="selectBlog" resultMap="blogResultMap">
select id, content,author,title from Blog where id = #{id}
</select>

<select id="selectBlogs" resultMap="blogResultMap">
select id, content,author,title from Blog
</select>

<!-- 自动生成 自增的id,设置 useGeneratedKeys="true" keyProperty="id" -->
<insert id="insertBlog" useGeneratedKeys="true" keyProperty="id">
insert into Blog(content,author,title) values (#{content}, #{author},#{title})
</insert>

<update id="updateBlog" parameterType="edu.hziee.models.Blog">
update Blog set
content = #{content},
title = #{title},
author = #{author}
where id=#{id}
</update>

<delete id="deleteBlog">
delete from Blog where id=#{id}
</delete>
</mapper>

blogMapper.java接口

blogMapper.java中的抽象方法要和xml文件中的sql语句对应。

1
2
3
4
5
6
7
8
9
package edu.hziee.mappers;
//只能是接口,不能是具体的类
public interface BlogMapper {
Blog selectBlog(int id);
List<Blog> selectBlogs();
int insertBlog(Blog blog);
int updateBlog(Blog blog);
int deleteBlog(int id);
}

BlogDao.java DAO层

(Data Access Object)是用于访问数据的对象
DAO层(数据库操作层):负责对数据向数据库增删改查的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package edu.hziee.dao;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import edu.hziee.mappers.BlogMapper;
import edu.hziee.models.Blog;

@Repository
public class BlogDao {

//注解驱动,自动装配
@Autowired
private BlogMapper blogMapper;

//增加
public void insertBlog(Blog blog){
blogMapper.insertBlog(blog);
}
//查询
public Blog selectBlog(int id){
return blogMapper.selectBlog(id);
}
//查询
public List<Blog> selectBlogs(){
return blogMapper.selectBlogs();
}
//删除
public void deleteBlog(int id){
blogMapper.deleteBlog(id);
}
//更新
public void updateBlog(Blog blog){
blogMapper.updateBlog(blog);
}
}

BlogController.java controller控制层

把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package edu.hziee.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import edu.hziee.dao.BlogDao;
import edu.hziee.models.Blog;

@Controller
@Transactional
@RequestMapping("/blog")
public class BlogController {

//注解驱动
@Autowired
BlogDao blogDao;

@RequestMapping(method=RequestMethod.GET)
public ModelAndView getBlogs(){
ModelAndView mav = new ModelAndView("blog/blogs");
//从数据库获取blog数据
List<Blog> blogs = blogDao.selectBlogs();
//显示在view视图上
mav.addObject("blogs",blogs);
return mav;
}
}

配置web.xml

web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。

web.xmlWEB-INF目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

<!-- 项目名称 -->
<display-name>myspring</display-name>

<!-- 项目默认的首页 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<!-- 配置spring的字符集过滤,解决中文插入数据库的乱码问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 配置spring的前端控制器 -->
<!-- spring默认配置文件是/WEB-INF/[servlet名字]-servlet.xml -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<!-- 或者通过增加这段配置来指定要初始化的dispatcher。 -->
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param> -->
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

配置dispatcher-servlet.xml

dispatcher-servlet.xmlWEB-INF目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!-- 注解驱动 -->
<mvc:annotation-driven />
<!-- 第三方的库,如bootstrap -->
<mvc:resources location="/resources/" mapping="/resources/**"/>

<!-- 在指定包下 扫描组件bean -->
<context:component-scan base-package="edu.hziee.controllers" />
<context:component-scan base-package="edu.hziee.dao" />

<!-- 连接数据库 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/javaee2016?characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 在spring中加入数据映射器接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="edu.hziee.mappers"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

<!-- 视图解析器 -->
<!-- 将jsp页面放在 WEB-INF/views 目录下 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>

还需要导入jar包,mybatis-3.4.1.jar

  • spring依赖包
  • mybatis依赖的包
  • commons-logging-1.2.jar
  • mysql-connector-java-5.1.38-bin.jar
  • mybatis-spring-1.3.0.jar
  • jstl.jar
  • standard.jar

需要build Path到项目,还要拷贝到WEB-INF/lib目录下。

spring映射

简单的页面跳转

1
<a href="blog">blogs页面</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
@RequestMapping("/blog")
public class BlogController {
@RequestMapping(method=RequestMethod.GET)
public ModelAndView getBlogs(){
ModelAndView mav = new ModelAndView("blog/blogs");
//从数据库取得数据
List<Blog> blogs = blogDao.selectBlogs();
//将数据存在model里
mav.addObject("blogs",blogs);
return mav;
}
}
  • 超链接地址href要对应控制器的映射地址@RequestMapping("/blog"),这样才会调用映射的方法。
  • ModelAndView mav = new ModelAndView("blog/blogs")或者mav.setViewName("blog/blogs")都能用来设置显示 blog文件夹 下的blogs.jsp页面。

image

因为在dispatcher-servlet.xml中配置过视图解析器如下

1
2
3
4
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
  • InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,
  • InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中
  • InternalResourceViewResolver会给它加上定义好的前缀和后缀,组成/WEB-INF/views/xxx.jsp的形式。如之前的例子,则是显示/WEB-INF/views/blog/blogs.jsp

重定向redirect

redirect 可以重定向到某个controller映射。

如下图,如果我要点击删除一条记录,然后再跳回这个页面。就需要用到请求重定向。

image

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = "delete/{id}",method = RequestMethod.GET)
public ModelAndView deleteBlog(@PathVariable int id){
ModelAndView mav = new ModelAndView();
//根据id从数据库删除对应数据
blogDao.deleteBlog(id);
//从数据库重新取数据
List<Blog> blogs = blogDao.selectBlogs();
//设置视图名称
mav.setViewName("redirect:/blog");
return mav.addObject("blogs",blogs);
}

因为我们需要返回到原来的页面,但是需要重新获取、显示数据,我们就不能只是简单的通过mav.setViewName("blog/blogs")显示这个视图,而是要调用映射到这个页面的方法,在通过这个方法获取数据,再显示到blogs.jsp页面上,也就是如下的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
@RequestMapping("/blog")
public class BlogController {
@RequestMapping(method=RequestMethod.GET)
public ModelAndView getBlogs(){
ModelAndView mav = new ModelAndView("blog/blogs");
//从数据库取得数据
List<Blog> blogs = blogDao.selectBlogs();
//将数据存在model里
mav.addObject("blogs",blogs);
return mav;
}
}

现在页面的URL是http://localhost:8080/myspring/blog,如果不使用redirect (即mav.setViewName("blog/blogs")) ,点击超链接,则URL变成http://localhost:8080/myspring/blog/delete/36,会显示没有映射的警告且不会有页面显示。

解决端口冲突问题

我们在启用某些服务时,比如启动本地Tomcat,或者本地MySQL,往往可能会存在因端口占用而启动失败的情况。

netstat -ano

我们可以打开命令行,输入netstat -ano查看所有端口的占用情况

img

比如我们要使用8100的端口号,我们就需要先找到占用这个端口号的程序,然后再将其关闭,

netstat -aon|findstr “端口号”

我们需要通过最后一列的PID来查找对应的程序,

我们也可以输入netstat -aon|findstr "8100"来查看对应的PID为5996。

img

tasklist|findstr “PID”

输入tasklist|findstr "5996"查看占用该端口的程序是什么。

img

taskkill /f /t /im 程序名称

输入 taskkill /f /t /im node.exe结束该程序。

img

通过任务管理器关闭程序

知道程序的PID之后我们通过PID在任务管理器中找到这个程序然后结束他。

img

内有侧滑效果图👉👉👉
阅读全文 »

响应式网站概念

  1. flexible grid layout 弹性网格布局

  2. flexible image 弹性图片

  3. media queries 媒体查询

    阅读全文 »

基于流的自动化构建工具
阅读全文 »

http-server 官网介绍

1. 安装 http-server

在window命令行输入npm install http-server -g,全局安装http-server,输入http-server -v查看版本号。

2. 启动 http-server

在命令行输入http-server src,src指的需要提供服务的路径。

然后会显示两个地址,一个本机地址,还有个是远程访问的地址,可以通过局域网访问。

3. 参数

我们可以在启动http-server服务时,通过添加-p 端口号,来更改服务器端口号,防止端口被占用。

多浏览器多终端同时进行调试的工具
阅读全文 »

Maven是一个强大的项目管理工具,其构建特性被普遍用于项目管理,Maven本身也是由Java所开发,它的出现给项目管理带来了极大的方便,告别了手动构建的时代
阅读全文 »

关于如何创建项目,并书写readme.md(可用来介绍项目,以及一些技术工具的介绍分享)
阅读全文 »