IDEA搭建web项目相关问题

本次主要是为了跑书上的代码,了解struts2框架的基本使用,因此代码都是直接复制粘贴,主要讨论的是配置问题

使用maven创建项目,好处是可以由maven下载相关包,无需自己导入下载

  1. 首先创建项目:选择maven-勾选Create from archetype-选择底下的webapp-然后点击next

  2. 接着项目命名随意,点击next

  3. 然后注意修改setting.xml文件
    笔者这里是自己的setting.xml文件
    修改方法参见这里:

    修改maven镜像:
    https://jiangyuesong.me/2016/11/07/maven-intellij-change-mirrors/

    原因是之前提到了 maven会自己下载所需包,但是有些包下载过慢,因此需要换用国内镜像

    至于local repository所选位置可自定义,或默认并无影响

    最后点击next-finish即完成创建

  4. 创建完后,显示如下:

    选择ok
    然后会有提示出来,在右下角

    选择enable auto import,这就是maven在帮我们自动配置

    如果之前没有修改镜像的话,这一步会特别慢,因此要注意

  5. auto import后文件目录显示如下

在此对文件夹进行相应说明:
(原文链接)

  • .idea:是IDEA自动生成 ,.idea文件夹来存放项目的配置信息。其中包括版本控制信息、历史记录等等。如果你不小心删除它,下次它还会自动生成。
  • src:项目的资源总目录,基本所有的操作都在这个文件夹里面进行。
  • main:和src基本作用差不多
  • webapp:这是前端部分,可以在这个目录下创建css、js等文件夹用于存放前端的一些静态文件。以及创建JSP等网页文件。
  • WEB-INF:WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
  • web.xml:web.xml的作用很大,是用来沟通后端的桥梁,这里可以配置一些信息,比如哪些是网站入口(index.jsp),声明404网页等等,以及声明哪些是后端的配置文件。整个web项目就是这样像纽带一样构建起来的。
  • pom.xml:pom.xml主要描述了项目的maven坐标,包依赖关系。我们不需要在手动下载一些jar包,然后手动依赖。只要遵循它规则,他会自动帮我们下载依赖,是不是很方便!!!
  1. 修改pom.xml,web.xml
    打开pom.xml文件,找到dependencies标签

    在标签添加依赖,添加方法很简单,你的项目用到了什么jar包你就去这个网站上进行搜索:
    https://mvnrepository.com

    进行搜索:

    选择相应包:

    复制框中代码:

    粘贴到dependencies标签下:

    之后要等一会自动配置完后

    由于本次创建是为了跑项目,项目中用到了struts2框架,因此我们才用了struts2相关包,自己应该根据实际需求自己判断添加哪些dependency

  2. 创建文件夹
    在WEB-INF下创建classes文件夹用来存放编译后输出的classes文件

    在main下新建java用来存放java代码,并将这个java文件夹标记为Sources Root

    关于idea不同文件夹标记及含义问题如下:

  • Source roots (or source folders)
    通过将文件夹加入这种类别,来告诉IntelliJ IDEA,这个文件夹和它的子文件夹中包含源码,在构建工程时,需要作为一部分被编译进去。
  • Test source roots (or test source folders; shown as rootTest)
    这个类型的文件夹也用于存放源码,不过是测试的源码(比如单元测试)。test source 文件夹可以帮助你将测试代码和产品代码分离开。
  • Resource roots
    该类文件夹用于存放你的应用中需要用到的资源文件(如:图片、xml或者properties配置文件等)。
    在构建过程中,resources文件夹中的内容均会按照原文件的样子被复制到输出文件夹。和sources文件夹一样,你可以定制你的resources文件夹的结构。你也可以指定你的resources文件夹中的文件被拷贝到输出文件的哪个文件夹中。

ps:

  • 默认情况下,工程编译后,resources中的文件和文件夹会被放置在和源码编译后相同的文件夹中,所以如果在源码中以相对路径读取resources中的配置文件时,可认为src中的java文件夹和resources为同一个根目录。
  • Test resource roots
    只有在java模式中可以使用)用于存放测试源码中关联的资源文件。除此之外,和resource文件夹没有区别。
  1. 之后在java文件中创建新的class文件,右击——New-Java Class
    如果没有java Class选项,那就是上一步没做对
    根据要运行的项目,我创建了两个java文件

    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    public class MyInterceptor {
    public String intercept(ActionInvocation arg0) throws Exception{
    //得到StrutsAction类对象
    StrutsAction action=(StrutsAction)arg0.getAction();
    //如果Action类中的name属性的值为"hello",返回错误页面
    if(action.getName().equals("hello")){
    return Action.ERROR;
    }
    //继续执行其他拦截器或Action类中的方法
    return arg0.invoke();
    }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsAction extends ActionSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public String execute() throws Exception{
if(!name.equals("HelloWorld")){
Map request=(Map)ActionContext.getContext().get("request");
request.put("name", getName());
return "success";
}
else
{
return "error";
}
}
public void validate() {
//如果姓名为空,则把错误信息添加到Action类的fieldErrors
if(this.getName()==null||this.getName().trim().equals("")){
addFieldError("name","姓名是必须的!"); //把错误信息保存起来
}
}
}
  1. 配置web.xml
    修改文本.xml内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2_1</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2_1</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
  1. 在创建的classes文件夹下新建struts.xml


    修改其中内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
    <package name="default" extends="struts-default">
    <interceptors>
    <interceptor name="myInterceptor" class="MyInterceptor"></interceptor>
    </interceptors>
    <default-interceptor-ref name=""></default-interceptor-ref>
    <action name="struts" class="StrutsAction" >
    <result name="success">/welcome.jsp</result>
    <result name="error">/hello.jsp</result>
    <result name="input">/hello.jsp</result>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <interceptor-ref name="myInterceptor"></interceptor-ref>
    </action>
    </package>
    </struts>
  2. 在index.jsp的位置添加并修改文件
    最后共有三个jsp文件 index.jsp,hello.jsp,welcome.jsp

    index.jsp不变

    hello.jsp代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <base href="<%=basePath%>">

    <title>实例5-1:struts2应用</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

    </head>

    <body>
    <form action="struts.action" method="post">
    请输入姓名:<input type="text" name="name"/><br>
    <input type="submit" value="提交"/>
    </form>
    </body>
    </html>

    welcome.jsp代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <base href="<%=basePath%>">

    <title>实例5-1:struts2应用</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

    </head>

    <body>
    hello<s:property value="#request.name"/>
    </body>
    </html>


  3. 更改配置
    点击File-Project Structure或者快捷键ctrl+alt+shift+s 来打开面板
    点击module-path修改编译的class文件输出路径

    修改为:

    都输出到建立的classes文件下,同时struts.xml也在这个文件下

  4. 进行运行前的服务器配置
    同样是打开structure面板
    修改Artifacts,点击exploded的选项,然后在如图所示的位置上右击,put into Output Root

    结果如下:

  5. 添加tomcat服务器
    首先点击右上角Add Configuration添加配置

    点击加号

    选择tomcat-local(需要自己下载tomcat,本文不提)


    采取默认设置,点击右下角的fix,添加exploded(也可以通过Deployment添加)

    这里说一下exploded和普通的区别:

    war模式:将web工程以war包的形式上传到服务器
    war exploed模式:将web工程以当前文件夹的位置关系上传到服务器
    war模式这种可以称之为是发布模式,看名字也知道,这是先打包war包,再发布;
    war exploded模式是直接把文件夹,jsp页面,classes等等移到Tomcat部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
    在平时开发的时候,使用热部署的话,应该对Tomcat进行相应的设置,这样的话修改的jsp界面什么的东西才可以及时的显示出来

  6. 运行

    首先点击项目上的小锤按钮进行编译,
    编译后classes文件夹下如下:

    然后点击箭头进行运行
    结果如下:


IDEA搭建web项目相关问题
https://shanhainanhua.github.io/2019/10/19/IDEA搭建web项目相关问题/
作者
wantong
发布于
2019年10月19日
许可协议