项目建立基础

项目建立基础–servlet:

1、导包:

建立javaweb时,首先需要导入mysql的包

导包资料可以通过maven repository里面找到,直接复制代码就可以了。

导包的时候需要注意是导在内部。

2、建包:

包名:包名采用普通域名反写的形式;例如:cn.tfs.web(第一个是顶级域名,第二个是所在组织名称,第三个是项目名字)

项目内部的结构分层:

1、dao(Data Access Object)数据持久层(数据持久化的操作,数据库操作)cn.tfs.dao

2、service业务层(编写需求业务代码层)cn.tfs.service

3、servlet/controller/web表现层/控制层(用于客户端响应的层)cn.tfs.servlet

4、entity/model/pojo/domain/实体类(javaBean)(用于以上三层进行数据传输的载体) cn.tfs.model

5、utils工具类用于公共调用的工具类,cn.tfs.utils

3、实体类:

该类需要包含get和set类以及toString方法。

同时命名的变量类型需要和数据库的类型相对应。

4、与数据库建立连接:

加载驱动----->建立连接------>执行语句------>得到结果集

5、数据持久层:

需要在每一个方法下添加一个close方法,避免因为不必要的资源浪费。

  public void close()
    {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (preparedStatement != null) {
                preparedStatement.close();
            }
            if (conn != null) {
                conn.close();
            }
        }catch( SQLException e)
        {
            e.printStackTrace();
        }

query方法时需要调用实体类的set方法,并且需要保证结果展现时导出数据库的数据是和实体类的数据类型是一致的。

  public List<MessageUser> query() {
        List<MessageUser> MessageUsers = new ArrayList<>();//顺序集合
        try {
            preparedStatement = conn.prepareStatement("select * from messageuser order by time desc;");//降序  上升asc
            //执行查询语句并将查询结果拿给结果集
            resultSet = preparedStatement.executeQuery();
            while(resultSet.next()){
                MessageUser messageUser1 = new MessageUser();
                messageUser1.setId(resultSet.getInt(1));
                messageUser1.setTime(resultSet.getString(3));
                messageUser1.setMessages(resultSet.getString(2));
                MessageUsers.add(messageUser1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close();
        }
        return MessageUsers;
    }

6、测试类:

测试可能遇到的问题可能是时区问题,从而导致数据库连接不上;

serverTimezone=GMT这个添加在properties的url里。
public class Test
{
    public static void main(String[] args) {
        MessageUser messageUser = new MessageUser();
        messageUser.setId(8);
        messageUser.setMessages("越远");
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       messageUser.setTime(simpleDateFormat.format(new Date()));
     // new MessageDao().add(messageUser);
        System.out.println(new MessageDao().query());
    }
}

7、servlet接口:

每一个接口都需要含有doget和dopost两种方法。

建立的servlet接口是需要继承HttpServlet类的

@WebServlet("/FindMessage")//接口
public class FindMessageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");//文字转换
        resp.addHeader("Access-Control-Allow-Origin","*");//解决跨域问题。
        resp.getWriter().print(new ObjectMapper().writeValueAsString(new MessageDao().query()));//调用函数并打印

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");//文字转化,这句在这里可不需要,因为调用dopost方法会也会启用doget方法,doget方法中是必须要有文字转换的。
        doGet(req, resp);
    }
}

如果是在同一个tomcat服务器内部建立的html,需要这样一个端口。这个端口的主要是做中转站的作用。(不过html文件内容是一样的)如果想要使用这个网页那么需要的网址是:localhost:端口号/1或者是127.0.0.1:端口号/1

@WebServlet("/1")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //用于转发请求到页面
        req.getRequestDispatcher("message.html").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
    }
}

如果是用hbuilder直接建立的html,则需要通过ajax封装。
url:“http://127.0.0.1:8888/FindMessage”,这句,发送请求地址。

并且还需要type:"GET"或者是type:“POST”,指明实施接口方法。

8、调试:

接口用左上方的tomcat 服务器,进行redeploy(重新部署)

然后进行http://127.0.0.1:8888/1进行网页查看。

调试时可能遇到的问题:

1、调试的时候可能会出现数据库中的文字显示不出来,主要原因是因为格式不相对应,一般网页显示是以ISO格式输出,一般用中文格式输出的是以utf-8的格式的格式输出:

resp.setContentType(“text/html;charset=utf-8”),用这一句话可以将文字显示出来。

2、跨域问题(这个问题是出现在两个服务器里的):

resp.addHeader("Access-Control-Allow-Origin","*");这个便可以解决跨域问题

3、还可能遇到抛出异常:

出现的原因是sql语句中格式错误。(JDBC中的sql语句必须严格按照mysql中的语句写法来。)

时间格式改写:

SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
messageUser.setTime(simpleDateFormat.format(new Date()));

或者是使用注解 @JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")

html网页修饰:

可以将jQuery的包导进js文件里。(jQuery是封装显示在网页的元素)

<script src="js/jquery.js" type="text/javascript" charset="utf-8">script>

脚本语句:

function是在HTML里面用来声明函数的。
js中的$符号(是jQuery的简写)的用处:
1、$()可以是$(expresion),即css选择器、Xpath或html元素,也就是通过上述表达式来匹配目标元素。

例如:

```
$("a")构造的这个对象,是用CSS选择器构建了一个jQuery对象——它选择了所有的<a/>这个标签。如: 
$("a").click(function(){...}) 
就是在点击页面上的任何一个链接时的触发事件。确切地说,就是jQuery用<a/>这个标签构建了一个对象$("a"),函数 click()是这个jQuery对象的一个(事件)方法。

```

2、$()可以是$(element),即一个特定的DOM元素。如常用的DOM对象有document、location、form等。如这样一行代码:

```HTML
$(document).find("div>p").html()); 
$()中的document是一个DOM元素,即在全文寻找带<p><div>元素,并显示<p>中的内容。 

```

3、$()可以是$(function),即一个函数,它是$(document).ready()的一个速记方式。

alert(“”):弹框

console.log()打印语句;

var:定义变量

data:发送到服务器的数据,如果不是字符串,需要看请求头的格式,再做出判断。

<script>
			function query(){
				$.ajax({
					url:"http://127.0.0.1:8888/FindMessage",
					type:"GET",<!--请求方式-->
					success:function(res){
						var array=JSON.parse(res);<!--请求成功后,封装参数-->
						var html='
    ' <!--循环拼接--> for (var i = 0; i < array.length; i++) { html +='
  • '+array[i].id+'楼:
    '
    +array[i].messages+'

    '+array[i].time+'


  • '
    ; } html+="
"
; $(".rediv").html(html);<!--最后输出到class为resdiv的容器中--> },error:function(error){ console.log(error) } }); } query(); function add(){ $.ajax({ url:"http://127.0.0.1:8888/insertMessage", type:"GET", data:{"messages":$("textarea[name='messages']").val()}, success:function(res){ if(res!=0){ $("textarea[name='messages']").val("") query(); }else{ alert("发送失败") } },error:function(error){ alert("发送失败") } }) }
script>

doGet方法和doPost方法的区别:

GET 调用用于获取服务器信息,并将其做为响应返回给客户端。

当经由Web浏览器或通过HTML、JSP直接访问Servlet的URL时,一般用GET调用。

GET调用在URL里显示正传送给servlet的数据,这在系统的安全方面可能带来一些问题,比如用户登录,表单里的用户名和密码需要发送到服务器端, 若使用Get调用,就会在浏览器的URL中显示用户名和密码。

Post它用于客户端把数据传送到服务器端,也会有副作用。

但好处是可以隐藏传送给服务器的任何数据。

Post适合发送大量的数据。

小知识:

分页查询小插件PageHelper

pagehelper是一款开源的第三方mybatis的物理分页插件,通过引入maven依赖和简单的配置,我们可以对当前执行的sql进行分页处理。

实验原理:

1、pageHelper使用了静态的 ThreadLocal 参数,每次的操作信息是放在线程里面的(分页参数和线程绑定),每一个ThreadLocal不会互相干扰,多线程情况下,ThreadLocal1获取到ThreadLocal1的参数,并不会和ThreadLocal2有数据交叉,有着较好的数据隔离。
2、通过拦截器,获取到对应线程之中的预编译的sql,然后做分页的二次处理(你可以发现,sql被加上了limit和select count(0))然后编译执行。
3、线程安全
pageHelper每次都会在finally中清除ThreadLocal对象,如果在pageHelper执行前发生了异常,就会导致线程不可用

分页查询在代码中实现只需要添加两个步骤:

第一个是在pom.xml文件中加入

	spring项目中添加
	
        com.github.pagehelper
        pagehelper
        5.1.2
    

springboot项目中添加
    
        com.github.pagehelper
        pagehelper-spring-boot-starter
        1.3.0
    

第二步:
在想要得分页的查询语句之前添加PageHelper.startPage(pageNum,pageSize);注意不要将顺序放错了,错了会导致查询出的数据没有分页效果。
pageNum:分页当前页数,pageSize:分页条数,
例如:
在这里插入图片描述
条数和页数,会通过插件自动添加到sql语句中去
list当中会包含当前页数,分页条数,以及总条数等信息。

你可能感兴趣的:(jdbc+html,html,数据库,servlet,java,前端)