JavaWeb
在使用Javaweb需要配置java服务器,也相当于承载web的容器,服务器就是安装了服务器软件的计算机,服务器软件用来接受用户的请求,做出响应,这里我使用tomcat作为服务器软件。比较常见的服务器软件有
-
weblogic:oracle公司,大型的javaEE服务器,支持所有的JavaEE规范,收费的
-
websphere:IBM公司,大型的javaEE服务器,支持所有的ovaTE规范,收费的
-
JBOSS:JBOSS公司,大型的javaEE服务器,支持所有的JavaIL规范,收费的
-
Tomcat:Apache基金组织,中小型的javaEE服务器,开源的,免费的
在web服务器中我们可以部署项目,用户可以通过浏览器来对我们的项目进行访问。
Servlet
servlet,filter,listener被称为JavaWeb的三大组件,servlet比较主要的就是设置其中的请求与响应。
使用servlet需要导入tomcat中servlet的包,再实现servlet接口,这里需要对xml文件进行配置
<servlet>
<servlet-name>Myservlet</servlet-name>
<servlet-class>Weblearn.Controller.MyServlet</servlet-class>
<load-on-startup>-1</load-on-startup>
<!-- 如果为负数不会先初始化-->
</servlet>
<servlet-mapping>
<servlet-name>Myservlet</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
servlet的执行原理就是通过访问ip地址服务器下的web文件(本地可直接用端口号进行访问)servlet-mapping标签中url-pattern,找到servlet-name,映射到servlet标签下的servlet-name,然后我们就去找对应文件,通过servlet-class找到对应包下的文件。当然我们也可以通过注解进行配置,对注解@WebServlet传参,里面有很多参数,默认参数为value。
我们实现servlet接口需要重写对应的方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//初始化
System.out.println("初始化"+this.getClass().getName());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//请求接口会调用的代码
System.out.println("请求");
System.out.println(servletRequest.getRemoteAddr());
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
//销毁垃圾数据
System.out.println("销毁");
}
我们通过方法名也应该大概了解其中的作用,init()可以设置servlet的初始化内容,初始化只执行一次,当且仅当启动该servlet文件时。service()处理请求和响应,每次访问servlet都会执行一次,destroy用来销毁垃圾数据,当服务器正常关闭时执行,释放资源。
Httpservlet
正常我们在使用servlet是实现servlet接口再对其方法重写调用,而HttpServlet内部已经引用了该接口,再对http协议进行了一次封装,所以我们使用HttpServlet只需要继承并重写doGet和doPost方法就能实现对应功能,简化操作。
@WebServlet("/hs")
public class HttpServlet extends javax.servlet.http.HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getMethod());//请求方法
System.out.println(req.getParameter("username"));//对应参数名的输入内容
System.out.println(req.getContextPath());//虚拟项目名字
System.out.println(req.getQueryString());//所有参数跟对应值,相邻用&
System.out.println(req.getServletPath());//获取项目下的servlet的路径
System.out.println(req.getRequestURL());//stringBuffered
System.out.println(req.getRequestURI());//string
System.out.println(req.getHeader("cookie"));//直接获取对应请求头中属性的值
Enumeration<String> headerNames = req.getHeaderNames();//获取请求头中所有的属性名称(枚举)
while (headerNames.hasMoreElements()){
String names = headerNames.nextElement();
System.out.println(names+""+req.getHeader(names));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getParameter("username"));//对应参数名的输入内容
System.out.println(req.getContextPath());//虚拟项目名字
}
}
get方法与post方法的区别主要就是发送参数的方式不同,get是直接拼接在访问路径上,而post是在请求体中以报文的形式发送。post的安全性稍微比get高一些,因为get是直接拼接在路径上的,安全性不高,在参数量上,get有长度限制,而post没有。