IDEA

快捷键使用

1、在java类中添加geter setter 方法,以及构造函数: Alt+insert

2、在函数前面输入 /** +enter

/**
     * 
     * @param index
     * @param limit
     * @return
     */

3、快速添加try-catch Ctrl+alt+t 【ps:必须提前把idea的大小写敏感关掉】

javascript 自动对齐格式_重定向

4、代码对齐、格式化:选中—>代码—>重新格式化代码

Servlet

1、request:表示⼀次请求,HttpServletRequest。
2、response:表示⼀次响应,HttpServletResponse。
3、pageContext:⻚⾯上下⽂,获取⻚⾯信息,PageContext。
4、session:表示⼀次会话,保存⽤户信息,HttpSession。
5、application:表示当前 Web 应⽤,全局对象,保存所有⽤户共享信息,ServletContext。
6、config:当前 JSP 对应的 Servlet 的 ServletConfig 对象,获取当前 Servlet 的信息。
7、out:向浏览器输出数据,JspWriter。
8、page:当前 JSP 对应的 Servlet 对象,Servlet。
9、exception:表示 JSP ⻚⾯发⽣的异常,Exception。

常⽤的是 request、response、session、application、pageContext

request

1、String getParameter(String key) 获取客户端传来的参数。
2、void setAttribute(String key,Object value) 通过键值对的形式保存数据。
3、Object getAttribute(String key) 通过 key 取出 value。
4、RequestDispatcher getRequestDispatcher(String path) 返回⼀个 RequestDispatcher 对象,该对象的 forward ⽅法⽤于请求转发。
5、String[] getParameterValues() 获取客户端传来的多个同名参数。
6、void setCharacterEncoding(String charset) 指定每个请求的编码。

注意getParameter与getAttribute的区别:

getParameter是从客户端提取参数;而getAttribute是从服务器端提取参数。

此外,如果set/getAttribute是跨请求的,则保存在session中

乱码问题

还有一个重要的地方:如果输入的请求中有中文,必须在第一行设置req.setCharacterEncoding(“UTF-8”);不然会乱码!

response

1、sendRedirect(String path) 重定向,⻚⾯之间的跳转。
转发 getRequestDispatcher 和重定向 sendRedirect 的区别:
转发是将同⼀个请求传给下⼀个⻚⾯,重定向是创建⼀个新的请求传给下⼀个页面,之前的请求结束生命周期。
转发:同⼀个请求在服务器之间传递,地址栏不变,也叫服务器跳转。
重定向:由客户端发送⼀次新的请求来访问跳转后的⽬标资源,地址栏改变,也叫客户端跳转。
如果两个⻚⾯之间需要通过 request 来传值,则必须使⽤转发,不能使⽤重定向。
⽤户登录,如果⽤户名和密码正确,则跳转到⾸⻚(转发),并且展示⽤户名,否则重新回到登陆页面
(重定向)。

转发

重定向

req.getRequestDispatcher

resp.senRedirect

将同⼀个请求传给下⼀个页面

创建⼀个新的请求传给下⼀个页面,之前的请求结束生命周期

同⼀个请求在服务器之间传递,地址栏不变

由客户端发送⼀次新的请求来访问跳转后的⽬标资源,地址栏改变

如果两个⻚⾯之间需要通过 request 来传值,则必须使⽤转发

⽤户登录,如果⽤户名和密码正确,则跳转到⾸⻚(转发),并且展示⽤户名,否则重新回到登陆⻚⾯(重定向)。

Session

常用方法:

String getId() 获取 sessionID
void setMaxInactiveInterval(int interval) 设置 session 的失效时间,单位为秒
int getMaxInactiveInterval() 获取当前 session 的失效时间
void invalidate() 设置 session ⽴即失效
void setAttribute(String key,Object value) 通过键值对的形式来存储数据
Object getAttribute(String key) 通过键获取对应的数据
void removeAttribute(String key) 通过键删除对应的数据

操作:

//存入session
HttpSession session = req.getSession();
session.setAttribute("reader",reader);
//取出session
HttpSession session = req.getSession();
Reader reader = (Reader)session.getAttribute("reader");

session:保存在服务器 保存的数据是 Object 会随着会话的结束而销毁 保存重要信息

生命周期:服务端:只要 WEB 应⽤重启就销毁,客户端:只要浏览器关闭就销毁。

EL & JSTL

EL表达式

前提是⼀定要先 setAttribute, EL 就相当于在简化 getAttribute;

<%
	User user = new User(1,"张三",86.5,new Address(1,"小寨"));
	pageContext.setAttribute("user",user);
%>
<table>
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>成绩</th>
        <th>地址</th>
    </tr>
    <tr>
        <td>${user.id}</td>
        <td>${user.name}</td>
        <td>${user.score}</td>
        <td>${user.address}</td>
    </tr>
</table>
${num1&&num2}
&& || ! < > <= <= ==
&& and
|| or
! not
== eq
!= ne
< lt
> gt
<= le
>= ge
empty 变量为 null,⻓度为0的String,size为0的集合

JSTL表达式

首先导入包:

1、需要导⼊ jar 包(两个 jstl.jar standard.jar)存放的位置 web/WEB-INF

2、在 JSP ⻚⾯开始的地⽅导⼊ JSTL 标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3、在需要的地⽅使⽤

<c:forEach items="${list}" var="user">   	<!--list是传回来的集合,用user遍历-->
 <tr>
 <td>${user.id}</td>
 <td>${user.name}</td>
 <td>${user.score}</td>
 <td>${user.address.value}</td>
 </tr>
</c:forEach>

核心标签库常用标签:

  • set、out、remove、catch
    set:向域对象中添加数据
<%
 requset.setAttribute(key,value)
%>
<c:set var="name" value="tom" scope="request"></c:set>
${requestScope.name}
<%
User user = new User(1,"张三",66.6,new Address(1,"科技路"));
request.setAttribute("user",user);
%>
${user.name}
<hr/>
<c:set target="${user}" property="name" value="李四"></c:set>
${user.name}

out:输出域对象中的数据

<c:set var="name" value="tom"></c:set>
<c:out value="${name}" default="未定义"></c:out>

remove:删除域对象中的数据

<c:remove var="name" scope="page"></c:remove>
<c:out value="${name}" default="未定义"></c:out>

catch:捕获异常

<c:catch var="error">
 <%
 int a = 10/0;
 %>
</c:catch>
${error}
  • 条件标签:if choose
<c:set var="num1" value="1"></c:set>
<c:set var="num2" value="2"></c:set>
<c:if test="${num1>num2}">ok</c:if>
<c:if test="${num1<num2}">fail</c:if>
<hr/>
<c:choose>
 <c:when test="${num1>num2}">ok</c:when>
 <c:otherwise>fail</c:otherwise>
</c:choose>
  • 迭代标签:forEach
<c:forEach items="${list}" var="str" begin="2" end="6" step="2"
varStatus="sta">
 ${sta.count}、${str}<br/>
</c:forEach>

AJAX

JDBC

此处我们直接用JDBC连接池

JDBC 的数据库连接池使⽤ javax.sql.DataSource 接⼝来完成的,DataSource 是 Java 官⽅提供的接 ⼝,使⽤的时候开发者并不需要⾃⼰来实现该接⼝,可以使⽤第三⽅的⼯具,C3P0 是⼀个常⽤的第三 ⽅实现,实际开发中直接使⽤ C3P0 即可完成数据库连接池的操作。

步骤:

1、把c3p0-xxx.jar 放到web-inf/lib下;

2、在src目录下创建一个c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
     <named-config name="testc3p0">
         <!-- 指定连接数据源的基本属性 -->
         <property name="user">root</property>
         <property name="password">root</property>
         <property name="driverClass">com.mysql.jdbc.Driver</property>
         <property name="jdbcUrl">jdbc:mysql://localhost:3306/library?
        useUnicode=true&characterEncoding=UTF-8</property>
         <!-- 若数据库中连接数不⾜时, ⼀次向数据库服务器申请多少个连接 -->
         <property name="acquireIncrement">5</property>
         <!-- 初始化数据库连接池时连接的数量 -->
         <property name="initialPoolSize">20</property>
         <!-- 数据库连接池中的最⼩的数据库连接数 -->
         <property name="minPoolSize">2</property>
         <!-- 数据库连接池中的最⼤的数据库连接数 -->
         <property name="maxPoolSize">40</property>
     </named-config>
</c3p0-config>

详细操作在MVC中

MVC

是一种开发模式,将程序分层的一种思想

M

V

C

Model

View

Controaller

业务数据(service repository entity)

视图(jsp html app客户端)

控制(servlet handler action)

请求进入Java web应用后,controller接收该请求,进行业务逻辑处理,最终将处理的结果再返回给用户(view+model)

entity:

controller(业务请求) ->service(是登录还是注册还是退出)->repository(连接数据库)[一个表对应一个repository]


controller 
         

           service 
         

           repository 
         

           DB


项目结构

javascript 自动对齐格式_客户端_02

utils层

这一层较为固定

public class JDBCTools {
    private static DataSource dataSource;
    static{
        dataSource = new ComboPooledDataSource("testc3p0");  //加载连接池中的配置
    }
    public static Connection getconnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        try {
            if(connection !=null){
                connection.close();
            }
            if(statement !=null){
                statement.close();
            }
            if(resultSet !=null){
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

repository层

  • 对数据库增删查改
public List<Book> findAll(int index,int limit) {
    //step1:连接数据库
    Connection connection = JDBCTools.getconnection();
    String sql = "SELECT * FROM book,bookcase where book.bookCase =bookcase.id limit ?,?";   
    //step2:初始化参数
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    List<Book> list =new ArrayList<>();
    try {
        //step3:把sql语言传入
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,index);
        preparedStatement.setInt(2,limit);
        //step4:把查询结果传到内存
        resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            list.add(new Book(resultSet.getInt(1),resultSet.getString(2),resultSet.getString(3)
                              ,new BookCase(resultSet.getInt(5),resultSet.getString(6))));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return list;
}
  • 统计个数
public int count() {
    Connection connection = JDBCTools.getconnection();
    String sql = "SELECT count(*) FROM book,bookcase where book.bookCase =bookcase.id ";
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    int count = 0;
    try {
        preparedStatement = connection.prepareStatement(sql);
        resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            count = resultSet.getInt(1);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return count;
}

service层

比较灵活,将controller与repository连接

示例为视频中的例子:分页展示数据

public class BookServiceImpl implements BookService {
    private BookRepository bookRepository = new BookRepositoryImpl();
    private BorrowRepository borrowRepository = new BorrowRepositoryImpl();
    private final Integer LIMIT = 6;//常量
    @Override
    public List<Book> findAll(int page) {
        int index = (page-1)*LIMIT;
        return bookRepository.findAll(index,LIMIT);
    }
    @Override
    public int getPages() {
        int count = bookRepository.count();
        int page = 0;
        if(count % LIMIT == 0){
            page = count/LIMIT;
        }else{
            page = count/LIMIT+1;
        }
        return page;
    }

controller层

public class BookServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String pageStr = req.getParameter("page");
        Integer page = Integer.parseInt(pageStr);
        List<Book> list = bookService.findAll(page);
        req.setAttribute("list",list);
        req.setAttribute("dataPrePage",6);
        req.setAttribute("currentPage",page);
        req.setAttribute("pages",bookService.getPages());
        req.getRequestDispatcher("index.jsp").forward(req,resp);
    }
}

之后会把ajax更新。