idea servlet不能创建main方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了idea servlet不能创建main方法?相关的知识,希望对你有一定的参考价值。
在idea中,新建了一个web项目,里面写了个servlet继承了HttpServlet,在这个类中创建main方法,直接右键运行main方法,会提示找不到主类。这是为什么?是idea或者maven做了什么魔术吗?注意看,是idea中,普通用命令java xxxx肯定能运行咯。
参考技术A servlet中没有main方法,是一种服务器端的Java应用程序,新建时直接建一个servlet,而不是一个class, Servlet由Web服务器进行加载IDEA开发servlet
目录
IDEA快捷键
alt+enter快速生成方法
.sout快速生成print方法
.notnull快速生成结构化if判断语句
开发servlet
新建一个New工程,这里直接点下一步
创建一个projectname为servlet01
目前只是一个空项目,只能做一些简答的文件编写,所以继续添加框架支持
添加完成后来尝试开发一个StudentServlet,内容如下;
package com.xy.javaweb.servlet;
public class StudentServlet implements Servlet
环境依赖
此时会提示我们并没有Servlet这个接口,所以我们需要将依赖servlet api.jar加入
依赖添加方法:
项目结构–>模块–>依赖
中间部分省略…
servlet代码如下
package com.xy.javaweb.servlet;
import jakarta.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
public class StudentServlet implements Servlet
@Override
public void init(ServletConfig servletConfig) throws ServletException
@Override
public ServletConfig getServletConfig()
return null;
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException
//设置响应类型内容
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//连接数据库JDBC
Connection conn =null;
PreparedStatement ps = null;
ResultSet rs = null;
try
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
String url = "jdbc:mysql://localhost:3306/jdbc";
String user = "root";
String password = "redhat";
conn = DriverManager.getConnection(url,user,password);
//获取预编译的数据库操作对象
String sql = "select id, name from t_student";
ps = conn.prepareStatement(sql);
//执行SQL
rs = ps.executeQuery();
//处理数据集
while(rs.next())
String id = rs.getString("id");
String name = rs.getString("name");
out.println(id+","+name+"<br>");
catch (ClassNotFoundException | SQLException e)
e.printStackTrace();
finally
//释放资源
//输入rs.notnull会自动弹出下列结构
if (rs != null)
try
rs.close();
catch (SQLException throwables)
throwables.printStackTrace();
if (ps != null)
try
ps.close();
catch (SQLException throwables)
throwables.printStackTrace();
if (conn != null)
try
conn.close();
catch (SQLException throwables)
throwables.printStackTrace();
@Override
public String getServletInfo()
return null;
@Override
public void destroy()
index.html代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>student page</title>
</head>
<body>
<!-----这里的项目名是/xmm。无法动态获取,先写死-->
<a href="/xmm/servlet/student">student list</a>
</body>
</html>
关键步骤,关联tomcat并配置项目名:
servlet 对象生命周期
如果在servlet配置文件中添加了<load-on-startup>子标签,越小的子标签优先级越大
<servlet>
<servlet-name>aservlet</servlet-name>
<servlet-class>com.xy.javaweb.servlet.Aservlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
创建了该标签后,servlet会在服务器启动时会被创建出来【默认情况下,服务器不会去实例化对象,要等用户访问该servlet才会被实例化】
serlvet有5个方法,这里我们拿出来三个做案例
public void init()
public void service()
public void destroy()
1.当有用户访问了servlet时,首先会去执行一个无参数构造方法,例如:
public Aservlet()
System.out.println("这个是无参数构造方法");
2.接着再去执行init(),用来初始化对象
上面两个方法都仅仅执行一遍,接下来再次刷新servlet的访问时,只会调用到service()方法
3.最后,当关闭tomcat服务器时,则会调用destroy()方法,用来释放内存
提问:
init方法为什么存在,他和无参构造方法有什么关系?
答:init方法就是为了代替构造方法,因为人工去写构造方法可能会定义不当(例如写成有参构造),导致无法进行实例化。
servlet规范中,不建议用户自己去构建构造方法,所以提供了init
以上是关于idea servlet不能创建main方法?的主要内容,如果未能解决你的问题,请参考以下文章
异常idea执行Main方法出现 Exception in thread "main" java.lang.NoClassDefFoundError: javax/servle(代