Perfree

Perfree

Perfree

简简单单的生活,安安静静的写博客~

54 文章数
71 评论数

JFinal-爽的一批的Controller(三)

perfree
2019-02-24 / 0 评论 / 2279 阅读 / 0 点赞

JFinal的Controller是线程安全的,所谓的线程安全就是在多线程访问时,采用了加锁机制来保护数据。这样的做的好处是不会出现脏数据。今天练习了一会儿,给我的感觉就是爽爽爽~

项目结构一览

本项目代码地址jfinal-demo-03-controller

pom文件

这个前期没啥好说的了,可以参考JFinal文档

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.perfree</groupId>
  <artifactId>jfinal-demo-03-controller</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  	<dependency>
    	<groupId>com.jfinal</groupId>
    	<artifactId>jetty-server</artifactId>
    	<version>2018.11</version>
    	<!--
			此处的 scope 值为 compile 仅为支持 IDEA 下启动项目
			打 war 包时需要改成 provided,以免将一些无用的 jar 打进去
		-->
    </dependency>
    
    <dependency>
    	<groupId>com.jfinal</groupId>
    	<artifactId>jfinal</artifactId>
    	<version>3.5</version>
    </dependency>
  </dependencies>
  
  <build>
    <finalName>jfinal-demo-03-controller</finalName>
	    <plugins>
	    	<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
					<!-- java8 保留参数名编译参数,支持 action 带参 -->
					<compilerArgument>-parameters</compilerArgument>
					<compilerArguments>
						<verbose />
					</compilerArguments>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

web.xml

<?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_2_5.xsd" version="2.5">
  <display-name>jfinal-demo-03-controller</display-name>
  <filter>
	<filter-name>jfinal</filter-name>
	<filter-class>com.jfinal.core.JFinalFilter</filter-class>
	<init-param>
		<param-name>configClass</param-name>
		<param-value>com.perfree.common.DemoConfig</param-value>
	</init-param>
  </filter>
  <filter-mapping>
	<filter-name>jfinal</filter-name>
	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

DemoConfig

com.perfree.common包下DemoConfig类继承JFinalConfig类

package com.perfree.common;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.template.Engine;
import com.perfree.controller.HelloController;

public class DemoConfig extends JFinalConfig {

	/**
	 * 启动入口,运行此 main 方法可以启动项目,此 main 方法可以放置在任意的 Class 类定义中,不一定要放于此
	 * 
	 * 使用本方法启动过第一次以后,会在开发工具的 debug、run configuration 中自动生成
	 * 一条启动配置项,可对该自动生成的配置再继续添加更多的配置项,例如 Program arguments
	 * 可配置为:src/main/webapp 80 / 5
	 * 
	 */
	public static void main(String[] args) {
		JFinal.start("src/main/webapp", 80, "/" ,5 );
	}
	
	/**
	 * 配置常量
	 */
	@Override
	public void configConstant(Constants me) {
		//开启开发模式
		me.setDevMode(true);
	}

	/**
	 * 配置路由
	 */
	@Override
	public void configEngine(Engine me) {

	}

	/**
	 * 配置插件
	 */
	@Override
	public void configHandler(Handlers me) {

	}

	/**
	 * 配置全局拦截器
	 */
	@Override
	public void configInterceptor(Interceptors me) {

	}

	/**
	 * 配置处理器
	 */
	@Override
	public void configPlugin(Plugins me) {

	}

	@Override
	public void configRoute(Routes me) {
		/*
		 * 配置/hello访问到HelloController的index()方法,这是约定,不要问为啥...
		 * 例如我们访问http://127.0.0.1/hello其实是访问到的HelloController的index()方法,
		 * 而我们访问http://127.0.0.1/hello/sayHello其实访问的是HelloController的sayHello()方法
		 */
		me.add("/hello", HelloController.class);
	}

}

HelloController

com.perfree.controller包下HelloController类,继承Controller

package com.perfree.controller;

import com.jfinal.core.Controller;

public class HelloController extends Controller {
	/**
	 * 参考DemoConfig,这个方法的默认访问路径为/hello
	 */
	public void index() {
		renderText("Hello JFinal");
	}
	
	/**
	 * 这个方法的默认访问路径为/hello/sayHello
	 */
	public void sayHello() {
		renderText("sayHello");
	}
	
	/**
	 * 这个方法的默认访问路径为/hello/sayHi
	 */
	public void sayHi() {
		renderText("Hi~");
	}
}

可以看出我配置了三个路径,在DemoConfig类中配置了

me.add("/hello", HelloController.class);

配置的Hello将默认访问到HelloController的index()方法,而在HelloController中我们书写的sayHello方法和sayHi方法分别对应/hello/sayHello路径和/hello/sayHi路径

运行测试

启动方法我写在了DemoConfig类中,这个启动方法写在哪个类中都可以的

启动成功,我们访问第一个地址http://127.0.0.1/hello

访问第二个,http://127.0.0.1/hello/sayHello

访问第三个,http://127.0.0.1/hello/sayHi

爽到爆有木有~接着我们搞一个html页面来测试一下:

login.html

最经典的案例当然是登录注册了~
在webapp下新建login.html,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
    <form action="/login/subLogin">
        <label>账号:</label><input type="text" name="name"> <br /><br /> 
        <label>密码:</label><input type="text" name="pwd"><br /><br />
        <button type="submit">登录</button>
    </form>
</body>
</html>

DemoConfig

接下来我们在DemoConfig类的configRoute方法里添加路由:

public void configRoute(Routes me) {
		/*
		 * 配置/hello访问到HelloController的index()方法,这是约定,不要问为啥...
		 * 例如我们访问http://127.0.0.1/hello其实是访问到的HelloController的index()方法,
		 * 而我们访问http://127.0.0.1/hello/sayHello其实访问的是HelloController的sayHello()方法
		 */
		me.add("/hello", HelloController.class);
		
		/**
		 * 第三个参数代表资源文件的目录,/为我们在启动方法配置的那个目录src/main/webapp
		 */
		me.add("/login", LoginController.class,"/");
	}

这里用到了第三个参数,它代表资源文件的目录,/为我们在启动方法配置的那个目录src/main/webapp

LoginController

在com.perfree.controller包下新建LoginController继承Controller

package com.perfree.controller;

import com.jfinal.core.Controller;

public class LoginController extends Controller{
	
	//先给个用户名~
	private String userName = "张三";
	//再给个密码~
	private String password = "123456";
	
	//默认访问此方法,返回login.html
	public void index() {
		render("login.html");
	}
	
	//登录方法
	public void subLogin() {
		//取得传来的name
		String name = getPara("name");
		//取得传来的pwd
		String pwd = getPara("pwd");
		//进行判断
		if(name.equals(userName) && pwd.equals(password)) {
			//登录成功
			renderText("欢迎你,"+name);
		}else {
			//登录失败
			renderText("账户或密码错误");
		}
	}

}

getPara()用来获取前台传来的值

运行

访问http://127.0.0.1/login

啪啪啪,先输入个正确的账号密码提交:

ok,进去了~至于为啥登录用了get方式。。。。只是传递的值看起来方便而已~
测试下错误的账号也是没问题的~

文章不错,扫码支持一下吧~
上一篇 下一篇
评论
来首音乐
最新回复
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月