加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Web系列:Java Web 项目基础

发布时间:2020-12-14 06:26:36 所属栏目:Java 来源:网络整理
导读:1.Java Web 模块结构 JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class。Java Web和ASP.NET的核心是分别是 和 接口,因此无论是基础的Page文件(JSP、ASPX)方式还是后来发展的MVC方式(Spring MVC、ASP.NET MVC)都是基于核心接口的基

1.Java Web 模块结构

JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class。Java Web和ASP.NET的核心是分别是接口,因此无论是基础的Page文件(JSP、ASPX)方式还是后来发展的MVC方式(Spring MVC、ASP.NET MVC)都是基于核心接口的基础上再次封装和扩展()。

除JSP文件外,其他全部文件部署在应用目录的子目录下,WEB-INF目录可以认为是ASP.NET中将web.config文件、bin目录和App_开头的运行时目录存放在了一个统一的根目录中。

Java Web的配置文件web.xml也存放在WEB-INF目录下,而ASP.NET的配置文件web.config一般直接存放在应用目录下(ASP.NET其他目录同样可以有web.config文件)。ASP.NET将所有的引用和代码生成的dll都部署在bin中,而Java Web的引用jar和生成的class分别存放在WEB-INF的子目录lib和classes中(参考1)。

综上,类似ASP.NET中的等,Java Web中的是我们必须了解和掌握的。

|--Assembly Root
  |---WEB-INF/
    |--web.xml
    |--lib/
    |--classes/
  1. WEB-INF目录:Java Web文件的根目录。
  2. web.xml文件:配置文件(asp.net web.config)。
  3. lib目录:存放类库文件(asp.net bin)。
  4. classes目录:存放class文件(asp.net bin)。

2.Java Web项目的基本结构[Eclipse Dynamic Web Project]

项目

(1)可以配置需要编译的源码目录和输出目录,默认编译src目录下的源文件到目录下。

(2)可以配置WEB-INF的根目录,默认为

(3)可以选择是否生成默认文件。

我们创建一个命名为DynamicWP的默认生成web.xml的Dynamic Web Proejct项目。文件结构如下:

|--DynamicWP
  |--.settings/
  |--build/
    |--classes/
  |--src/
  |--WebContent/
    |--META-INF/
      |--MANIFEST.MF
    |--WEB-INF/
      |--web.xml
      |--lib/

在Eclipse的项目资源管理器中DyanmicWP项目的视图如下:

|--DynamicWP
  |--Deployment Desciptor
  |--JAX-WS Web Services
  |--Java Resources
  |--JavaScript Resources
  |--build
  |--WebContent
    |--META-INF/
      |--MANIFEST.MF
    |--WEB-INF/
      |--web.xml
      |--lib/
  1. .settings为Eclipse项目文件夹,存放了Eslipse项目的各种配置。在Eclipse项目视图中不可见。
  2. src目录存放源码。在Eclipse的项目视图中对应为Java Resources/src。
  3. build存放编译后的文件。
  4. 可以在类似的目录中查看运行时的文件结构。

3.Maven Web项目的基本结构

鉴于目前Java IDE众多并且都有一定的拥泵,Eclipse的Java Web项目不具有可移植性。即解决了项目结构的规范问题又提供了强大引用处理等强大的功能,在项目布局等方面已经是目前事实上的标准。Maven项目的主要结构如下(参考2):

|--root
  |--
  |--/
    |--main/
      |--java/
      |--resources/
      |--webapp/
    |--test/
      |--java/
      |--resources
  |--/

|--MavenWP
  |--pom.xml
  |--.project
  |--.classpath
  |--.settings/
  |--src/
  |--target/
    |--classes/
    |--m2e-wtp/
  1. pom.xml:maven项目配置文件。
  2. .project文件和.classpath文件以及.settings目录和target/m2e-wtp目录下的文件为Eclipse项目配置文件。
  3. src和target:maven标准项目目录。

Eclipse4.5.1中对应的项目资源管理视图

|--MavenWP
  |--Deployment Desciptor/
  |--Java Resources/
  |--JavaScript Resources/
  |--Deployed Resources/
  |--src
  |--target
  |--pom.xml
  1. 默认创建的项目会添加一个index.jsp并报错:使用maven搜索并添加servlet依赖更新后就可以正常运行。
  2. Java构建路径问题警告:使用maven搜索并添加插件并配置configuration节点更新就可以消除。
  3. 墙的问题配置maven,我采用的是http://maven.oschina.net/content/groups/public/。
  4. 默认创建的maven webapp缺少的src/main/java、src/test/java和src/test/resources等目录需要自己手动添加。
  5. 修改.settings/org.eclipse.wst.common.project.facet.core.xml,更新
  6. web.xml根节点开始部分修改如下:

Maven的配置文件pom.xml:

xmlns:xsi==> . me.test MavenWP war .-SNAPSHOT MavenWP Maven Webapp http: junit junit . test javax.servlet javax.servlet-api . MavenWP org.apache.maven.plugins maven-compiler-plugin

4.servlet基础

正如ASP.NET的核心是一样,Java Web的核心是接口,位于javax.servlet命名空间中。的概念可以参考ASP.NET的,Servlet中的各种可以参考ASP.NET HttpApplicaiton中类似的。无论是Java还是.NET的Web技术,都是基于HTTP协议的具体实现。Java Web和ASP.NET中的一些核心项对应如下:

Servlet和ASP.NET的简化示意图:

用于简化web.xml配置的Servlet的注解(3.0开始支持,在ASP.NET中没有对应项):

(1)WebServlet:作用在javax.servlet.http.HttpServlet的实现类上。

(2)WebFilter:作用在javax.servlet.Filter的实现类上。

(3)

5.自定义Session

在存储安全性要求较高的会话信息方面是必不可少的,Session当然绝对不是用来存储用户登录状态的,但类似验证码等敏感信息却必须存储在Session中。对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的。

ASP.NET通过通过配置文件配置实际的Session提供程序,Session提供程序实现了,因此在ASP.NET中实现自定义Session是通过继承SessionStateStoreProviderBase实现,配置Session是通过。ASP.NET自定义session的代码参考github上的开源项目。

同理,Java Servlet中使用自定义Session通过可以实现。由于不同的servlet容器对Session的实现不同,所以通用性最好的方式是继承重写方法返回自定义的Session对象。采用了,HttpServletRequestWrapper采用了,可以通过《Head First 设计模式》阅读模式的相关内容。

(1)首先自定义继承HttpSession的MySession(为了便于演示,仅包装了容器的session并转发调用)。

<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletContext;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.HttpSession;

<span style="color: #0000ff;">public <span style="color: #0000ff;">class MySession <span style="color: #0000ff;">implements<span style="color: #000000;"> HttpSession {

</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; HttpSession _containerSession;

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; MySession(HttpSession session) {
    </span><span style="color: #0000ff;"&gt;this</span>._containerSession =<span style="color: #000000;"&gt; session;
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; getCreationTime() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getCreationTime();
}

@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String getId() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getId();
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;long</span><span style="color: #000000;"&gt; getLastAccessedTime() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getLastAccessedTime();
}

@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; ServletContext getServletContext() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getServletContext();
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span> setMaxInactiveInterval(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; interval) {
    </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.setMaxInactiveInterval(interval);
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; getMaxInactiveInterval() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getMaxInactiveInterval();
}

@SuppressWarnings(</span>"deprecation"<span style="color: #000000;"&gt;)
@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; HttpSessionContext getSessionContext() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getSessionContext();
}

@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Object getAttribute(String name) {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getAttribute(name);
}

@SuppressWarnings(</span>"deprecation"<span style="color: #000000;"&gt;)
@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Object getValue(String name) {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getValue(name);
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> Enumeration<String><span style="color: #000000;"&gt; getAttributeNames() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getAttributeNames();
}

@SuppressWarnings(</span>"deprecation"<span style="color: #000000;"&gt;)
@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String[] getValueNames() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.getValueNames();
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setAttribute(String name,Object value) {
    </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.setAttribute(name,value);
}

@SuppressWarnings(</span>"deprecation"<span style="color: #000000;"&gt;)
@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; putValue(String name,Object value) {
    </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.putValue(name,value);
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; removeAttribute(String name) {
    </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.removeAttribute(name);
}

@SuppressWarnings(</span>"deprecation"<span style="color: #000000;"&gt;)
@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; removeValue(String name) {
    </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.removeValue(name);
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; invalidate() {
    </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.invalidate();
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; isNew() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;._containerSession.isNew();
}

}

(2)自定义继承HttpServletRequestWrapper的MyRequest

<span style="color: #0000ff;">public <span style="color: #0000ff;">class MyRequest <span style="color: #0000ff;">extends<span style="color: #000000;"> HttpServletRequestWrapper {

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; MyRequest() {
    </span><span style="color: #0000ff;"&gt;super</span>(<span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;);
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; MyRequest(HttpServletRequest request) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;(request);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO 自动生成的构造函数存根</span>

<span style="color: #000000;"> }

@Override
</span><span style="color: #0000ff;"&gt;public</span> HttpSession getSession(<span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; create) {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;new</span> MySession(<span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;.getSession(create));
}

@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; HttpSession getSession() {
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;new</span> MySession(<span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;.getSession());
}

}

(3)自定义Filter将Request包装为MyRequest

<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.Filter;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.FilterChain;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.FilterConfig;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletException;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletRequest;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.ServletResponse;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.annotation.WebFilter;
<span style="color: #0000ff;">import<span style="color: #000000;"> javax.servlet.http.HttpServletRequest;

@WebFilter("/*"<span style="color: #000000;">)
<span style="color: #0000ff;">public <span style="color: #0000ff;">class MyFilter <span style="color: #0000ff;">implements<span style="color: #000000;"> Filter {

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span> init(FilterConfig filterConfig) <span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; ServletException {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO 自动生成的方法存根</span>

<span style="color: #000000;">
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
        </span><span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; IOException,ServletException {
    chain.doFilter(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; MyRequest((HttpServletRequest) request),response);

}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; destroy() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO 自动生成的方法存根</span>

<span style="color: #000000;">
}

}

通过注解配置了Filter,也可以通过原始的web.xml方式配置。

6.参考

1.https://docs.oracle.com/javaee/7/tutorial/packaging003.htm

2.http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

3.https://docs.oracle.com/javaee/7/tutorial/webapp005.htm

小结:

你至少应该知道的:

(1)配置文件:ASP.NET的web.config和Java的web.xml

(2)Web核心:ASP.NET的IHttpHandler接口和Java的Servlet接口

(3)拦截器:ASP.NET的HttpModule和Java的Filter

(4)应用程序事件:ASP.NET的HttpApplication event和Java的各种Listener

(5)启动器:ASP.NET的Application_Start和Java的ServletContainerInitializer

(6)引用管理:ASP.NET的Nuget和Java的Maven

感想:

ASP.NET的核心对象不像Java Servlet一样,从一开始就基于接口,这是缺点。但Java Servlet的核心对象全靠容器实现,就连HttpSession同样如此,这也是缺点。比如自定义个Session十分麻烦,没有像ASP.NET一样简单配置即可。另外Servlet的一些抽象定义有点过头了,不够简洁。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!