JavaEE
创建javaEE程序
创建一个类 继承HttpServlet,我们这个类就是一个javaEE程序,
在web.xml文件配置,向外提供一个访问地址,就可以在浏览器中访问,找到对应javaEE程序
什么是Servlet
Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序. 它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用
Servlet方法。
Servlet的作用
1.接收用户发送的请求数据
2.调用其他的java程序来处理请求
3.根据处理结果,将结果响应给客户端
创建和使用Servlet
1.创建一个类继承javax.servlet.http包下的HttpServlet
2.在web.xml文件中配置Servlet
<!--
配置Servlet程序,把我们开发的servlet程序注册到服务器,由服务器启动时加载,在第一次访问时,由服务器创建对象
-->
<servlet>
<servlet-name>demo</servlet-name><!--定义对象名-->
<servlet-class>com.ffyc.dormServer.web.DemoServlet</servlet-class><!--注册servlet程序-->
<init-param><!--向servlet中配置一些参数-->
<param-name>count</param-name>
<param-value>10</param-value>
</init-param>
</servlet>
<!--
为Servlet程序配置一个访问地址
-->
<servlet-mapping>
<servlet-name>demo</servlet-name><!--为指定name的servlet程序配置访问地址-->
<url-pattern>/demo</url-pattern><!--配置的供外界访问的地址 必须以 / 开头-->
</servlet-mapping>
Servlet的生命周期
public class DemoServlet extends HttpServlet {
/*
无参构造方法,默认是存在的,初始化创建的对象
只被调用一次(始终只创建了一个对象),在第一次访问servlet程序由服务器创建执行
*/
public DemoServlet(){
System.out.println("无参构造方法");
}
/*
init() 初始化 在构造方法执行完成后,立即被调用执行,完成一些servlet程序的初始化(例如,读取配置文件中的参数)
只执行一次
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init:"+config.getInitParameter("count"));
}
/*
service()用来接收前端请求,为前端提供服务的,
每次前端发送的请求,都会调用service(),多次调用
HttpServletRequest req:表示请求对象,前端提交过来所有的数据,都由服务器封装在此对象中
HttpServletResponse resp:表示响应对象,用来向前端响应数据
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service:"+req);
System.out.println("service:"+resp);
}
/*
destroy()在服务器关闭时,如果我们的程序想要最终执行某些操作,就可以在destroy中实现
*/
@Override
public void destroy() {
System.out.println("destroy");
}
}
过滤器
什么是过滤器
过滤器,顾名思义就是对事物进行过滤的,在Web中的过滤器,当然就是对请求进行过滤。
过滤器有什么用
我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊功能。如登录控制,权限管理,过滤敏感词汇等.
过滤器的搭建
创建过滤器,只需要继承Filter接口即可
/*
定义统一编码过滤器
*/
public class EncodFilter implements Filter {
String reqencod = "";
String respencod = "";
//在init方法中,可以通过filterConfig获得配置文件中的初始化参数
@Override
public void init(FilterConfig filterConfig) throws ServletException {
reqencod = filterConfig.getInitParameter("reqencod");
respencod = filterConfig.getInitParameter("respencod");
}
/*
执行过滤任务
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("编码过滤器");
servletRequest.setCharacterEncoding(reqencod);//设置请求数据编码格式
servletResponse.setContentType(respencod);//设置响应内容编码格式
//让请求离开当前的过滤器,向后执行
filterChain.doFilter(servletRequest, servletResponse);
}
}
配置过滤器拦截路径
<!-- 配置统一编码过滤器 -->
<filter>
<filter-name>encodfilter</filter-name>
<filter-class>com.ffyc.dormServer.filter.EncodFilter</filter-class>
<init-param>
<param-name>reqencod</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>respencod</param-name>
<param-value>text/html;charset=utf-8</param-value>
</init-param>
</filter>
<!-- 配置哪些请求地址可以进入到过滤器 -->
<filter-mapping>
<filter-name>encodfilter</filter-name>
<!--<url-pattern>/demo</url-pattern>
<url-pattern>/login</url-pattern>-->
<url-pattern>/*</url-pattern><!-- 让所有的请求都进入到编码过滤器 -->
</filter-mapping>
跨域问题
跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com
页面去请求www.google.com的资源。但是一般情况下不能这么做,它是由
浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。跨域的严
格一点的定义是:只要协议,域名,端口有任何一个的不同,就被当作是跨域.
所谓同源是指,域名,协议,端口均相同,只要有一个不同,就是跨域.
后端解决
配置允许跨域的过滤器
<!-- 允许跨域访问的过滤器 -->
<filter>
<filter-name>cors</filter-name>
<filter-class>com.ffyc.dormServer.filter.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class CorsFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
//允许携带Cookie时不能设置为* 否则前端报错
httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
filterChain.doFilter(servletRequest, servletResponse);
}
}