idea快捷键:
刚用idea还不是很习惯,顺便记录一下方便的快捷键把
ctrl+D : 复制一行
ctrl+alt+t : 包围起来,包括if、while、try catch等等
.var:自动补充对象的所属类 也可以用ctrl+alt+V
.sout: 自动补充输出函数system.out.println()
psvm: 主方法
ctrl+o,获得该类和父类中的成员方法
alt+Insert: 快速添加getter和setter方法
多列编辑:按住alt然后选中需要编辑的列即可
获取当前文件路径:System.out.println(System.getProperty("user.dir"));
编码规范:
创建mavenweb项目
项目结构介绍
WEB-INF下存放项目依赖的jar包、配置文件和字节码文件
使用骨架(模板)创建web项目
archetype选最后的webapp
然后模板默认是没有java目录的,需要我们自己添加一个。
配置tomcat
servlet
简介:
Servlet 是 Java 编写的服务器端程序,运行在支持 Java 的 Web 服务器上,用于处理客户端的请求并生成动态的响应。Servlet 主要用于构建 Web 应用程序,可以接收来自用户请求的输入数据,处理数据,然后生成响应返回给客户端。
配置:
执行流程:
体系结构:
demo:
package com.example.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo")
public class servletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理get请求
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理post请求
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("hello");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String method = request.getMethod();
if(method.equals("GET")){
//处理get请求
}
if(method.equals("POST")){
//处理post请求
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
但是上面的小demo有一个问题就是当你创建新的servlet时又需要重新在service中写一遍例如init、service这种不同servlet都通用的方法,为了解决这个问题可以用一个类封装这些方法,servlet子类只需要继承这个父类,并重写doget和dopost方法来满足这个servlet自身的需求即可。
package com.example.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class httpServlet extends javax.servlet.http.HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理get请求
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理post请求
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("hello");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String method = request.getMethod();
if(method.equals("GET")){
//处理get请求
}
if(method.equals("POST")){
//处理post请求
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
urlPattern:
一个servlet可以匹配多个路由:
@WebServlet(urlPatterns = {"/demo","demo2"})
jsp
简介:
原理:
我们来看一下转换后的serverlet文件,位置可以通过下面方式找到。
然后依次进入如下的目录,就能找到
C:\Users\asus\AppData\Local\JetBrains\IntelliJIdea2023.2\tomcat\4954f572-6cab-4852-99b9-0ec94f1e5d6b\work\Catalina\localhost\ROOT\org\apache\jsp
//hello_jsp.java
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/9.0.85
* Generated at: 2024-03-22 13:33:10 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h2>Hello World!</h2>\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
可以看到其实就是把serverlet接受参数然后填充到html代码并输出,所以本质上jsp就是serverlet。
代码样式:
<%= %>就是输出内容,这个内容可以是在<% %>中定义的变量
<% int i = 3%>
<%=i%>
在代码中的实现
此外,<%%>中的代码是可以中断的,方便我们在代码间插入html语言等等
快速入门:
缺点:
el表达式:
针对jsp的缺点,可以只在serverlet中获取数据并转发数据,在jsp中直接使用el表达式拿到数据即可,不需要多写java代码。
demo:
package com.example.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo")
public class servletDemo extends httpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理get请求
User user = new User();
user.setName("zhangsan");
//添加到request域
req.setAttribute("brands","aaaa");
req.setAttribute("User",user);
//将请求转发到el.jsp页面
req.getRequestDispatcher("/el.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理post请求
System.out.println("post");
}
}
//el.jsp
<%@ page import="com.example.servlet.User" %><%--
Created by IntelliJ IDEA.
User: asus
Date: 2024/3/24
Time: 21:58
To change this template use File | Settings | File Templates.
--%>
<%-- web版本过低,el表达式会直接输出${} ,加上下面这行即可 --%>
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${User.name}
${brands}
</body>
</html>